Skip to content

Commit 86aa160

Browse files
committed
Merge tag 'soc-attr-updates-5.9' of git://git.kernel.org/pub/scm/linux/kernel/git/sudeep.holla/linux into arm/drivers
SoC attributes update for v5.9 1. Addition of ARM SMCCC ARCH_SOC_ID support 2. Usage of the custom soc attribute groups already supported in the infrastucture instead of device_create_file which eliminates the need for any cleanup when soc is unregistered 3. Minor clean up switching to use standard DEVICE_ATTR_RO() instead of direct __ATTR * tag 'soc-attr-updates-5.9' of git://git.kernel.org/pub/scm/linux/kernel/git/sudeep.holla/linux: firmware: smccc: Add ARCH_SOC_ID support ARM: OMAP2: Use custom soc attribute group instead of device_create_file ARM: OMAP2: Switch to use DEVICE_ATTR_RO() soc: ux500: Use custom soc attribute group instead of device_create_file soc: ux500: Switch to use DEVICE_ATTR_RO() soc: integrator: Use custom soc attribute group instead of device_create_file soc: integrator: Switch to use DEVICE_ATTR_RO() soc: realview: Use custom soc attribute group instead of device_create_file soc: realview: Switch to use DEVICE_ATTR_RO() Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Arnd Bergmann <[email protected]>
2 parents 4877846 + 821b67f commit 86aa160

File tree

9 files changed

+228
-69
lines changed

9 files changed

+228
-69
lines changed

Documentation/ABI/testing/sysfs-devices-soc

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,30 @@ Description:
2626
Read-only attribute common to all SoCs. Contains SoC family name
2727
(e.g. DB8500).
2828

29+
On many of ARM based silicon with SMCCC v1.2+ compliant firmware
30+
this will contain the JEDEC JEP106 manufacturer’s identification
31+
code. The format is "jep106:XXYY" where XX is identity code and
32+
YY is continuation code.
33+
34+
This manufacturer’s identification code is defined by one
35+
or more eight (8) bit fields, each consisting of seven (7)
36+
data bits plus one (1) odd parity bit. It is a single field,
37+
limiting the possible number of vendors to 126. To expand
38+
the maximum number of identification codes, a continuation
39+
scheme has been defined.
40+
41+
The specified mechanism is that an identity code of 0x7F
42+
represents the "continuation code" and implies the presence
43+
of an additional identity code field, and this mechanism
44+
may be extended to multiple continuation codes followed
45+
by the manufacturer's identity code.
46+
47+
For example, ARM has identity code 0x7F 0x7F 0x7F 0x7F 0x3B,
48+
which is code 0x3B on the fifth 'page'. This is shortened
49+
as JEP106 identity code of 0x3B and a continuation code of
50+
0x4 to represent the four continuation codes preceding the
51+
identity code.
52+
2953
What: /sys/devices/socX/serial_number
3054
Date: January 2019
3155
contact: Bjorn Andersson <[email protected]>
@@ -40,6 +64,12 @@ Description:
4064
Read-only attribute supported by most SoCs. In the case of
4165
ST-Ericsson's chips this contains the SoC serial number.
4266

67+
On many of ARM based silicon with SMCCC v1.2+ compliant firmware
68+
this will contain the SOC ID appended to the family attribute
69+
to ensure there is no conflict in this namespace across various
70+
vendors. The format is "jep106:XXYY:ZZZZ" where XX is identity
71+
code, YY is continuation code and ZZZZ is the SOC ID.
72+
4373
What: /sys/devices/socX/revision
4474
Date: January 2012
4575
contact: Lee Jones <[email protected]>

arch/arm/mach-omap2/id.c

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -775,19 +775,23 @@ static const char * __init omap_get_family(void)
775775
return kasprintf(GFP_KERNEL, "Unknown");
776776
}
777777

778-
static ssize_t omap_get_type(struct device *dev,
779-
struct device_attribute *attr,
780-
char *buf)
778+
static ssize_t
779+
type_show(struct device *dev, struct device_attribute *attr, char *buf)
781780
{
782781
return sprintf(buf, "%s\n", omap_types[omap_type()]);
783782
}
784783

785-
static struct device_attribute omap_soc_attr =
786-
__ATTR(type, S_IRUGO, omap_get_type, NULL);
784+
static DEVICE_ATTR_RO(type);
785+
786+
static struct attribute *omap_soc_attrs[] = {
787+
&dev_attr_type.attr,
788+
NULL
789+
};
790+
791+
ATTRIBUTE_GROUPS(omap_soc);
787792

788793
void __init omap_soc_device_init(void)
789794
{
790-
struct device *parent;
791795
struct soc_device *soc_dev;
792796
struct soc_device_attribute *soc_dev_attr;
793797

@@ -798,14 +802,12 @@ void __init omap_soc_device_init(void)
798802
soc_dev_attr->machine = soc_name;
799803
soc_dev_attr->family = omap_get_family();
800804
soc_dev_attr->revision = soc_rev;
805+
soc_dev_attr->custom_attr_group = omap_soc_groups[0];
801806

802807
soc_dev = soc_device_register(soc_dev_attr);
803808
if (IS_ERR(soc_dev)) {
804809
kfree(soc_dev_attr);
805810
return;
806811
}
807-
808-
parent = soc_device_to_device(soc_dev);
809-
device_create_file(parent, &omap_soc_attr);
810812
}
811813
#endif /* CONFIG_SOC_BUS */

drivers/firmware/smccc/Kconfig

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,12 @@ config HAVE_ARM_SMCCC_DISCOVERY
1414
to add SMCCC discovery mechanism though the PSCI firmware
1515
implementation of PSCI_FEATURES(SMCCC_VERSION) which returns
1616
success on firmware compliant to SMCCC v1.1 and above.
17+
18+
config ARM_SMCCC_SOC_ID
19+
bool "SoC bus device for the ARM SMCCC SOC_ID"
20+
depends on HAVE_ARM_SMCCC_DISCOVERY
21+
default y
22+
select SOC_BUS
23+
help
24+
Include support for the SoC bus on the ARM SMCCC firmware based
25+
platforms providing some sysfs information about the SoC variant.

drivers/firmware/smccc/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
# SPDX-License-Identifier: GPL-2.0
22
#
33
obj-$(CONFIG_HAVE_ARM_SMCCC_DISCOVERY) += smccc.o
4+
obj-$(CONFIG_ARM_SMCCC_SOC_ID) += soc_id.o

drivers/firmware/smccc/soc_id.c

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
// SPDX-License-Identifier: GPL-2.0
2+
/*
3+
* Copyright 2020 Arm Limited
4+
*/
5+
6+
#define pr_fmt(fmt) "SMCCC: SOC_ID: " fmt
7+
8+
#include <linux/arm-smccc.h>
9+
#include <linux/bitfield.h>
10+
#include <linux/device.h>
11+
#include <linux/module.h>
12+
#include <linux/kernel.h>
13+
#include <linux/slab.h>
14+
#include <linux/sys_soc.h>
15+
16+
#define SMCCC_SOC_ID_JEP106_BANK_IDX_MASK GENMASK(30, 24)
17+
/*
18+
* As per the SMC Calling Convention specification v1.2 (ARM DEN 0028C)
19+
* Section 7.4 SMCCC_ARCH_SOC_ID bits[23:16] are JEP-106 identification
20+
* code with parity bit for the SiP. We can drop the parity bit.
21+
*/
22+
#define SMCCC_SOC_ID_JEP106_ID_CODE_MASK GENMASK(22, 16)
23+
#define SMCCC_SOC_ID_IMP_DEF_SOC_ID_MASK GENMASK(15, 0)
24+
25+
#define JEP106_BANK_CONT_CODE(x) \
26+
(u8)(FIELD_GET(SMCCC_SOC_ID_JEP106_BANK_IDX_MASK, (x)))
27+
#define JEP106_ID_CODE(x) \
28+
(u8)(FIELD_GET(SMCCC_SOC_ID_JEP106_ID_CODE_MASK, (x)))
29+
#define IMP_DEF_SOC_ID(x) \
30+
(u16)(FIELD_GET(SMCCC_SOC_ID_IMP_DEF_SOC_ID_MASK, (x)))
31+
32+
static struct soc_device *soc_dev;
33+
static struct soc_device_attribute *soc_dev_attr;
34+
35+
static int __init smccc_soc_init(void)
36+
{
37+
struct arm_smccc_res res;
38+
int soc_id_rev, soc_id_version;
39+
static char soc_id_str[20], soc_id_rev_str[12];
40+
static char soc_id_jep106_id_str[12];
41+
42+
if (arm_smccc_get_version() < ARM_SMCCC_VERSION_1_2)
43+
return 0;
44+
45+
if (arm_smccc_1_1_get_conduit() == SMCCC_CONDUIT_NONE) {
46+
pr_err("%s: invalid SMCCC conduit\n", __func__);
47+
return -EOPNOTSUPP;
48+
}
49+
50+
arm_smccc_1_1_invoke(ARM_SMCCC_ARCH_FEATURES_FUNC_ID,
51+
ARM_SMCCC_ARCH_SOC_ID, &res);
52+
53+
if (res.a0 == SMCCC_RET_NOT_SUPPORTED) {
54+
pr_info("ARCH_SOC_ID not implemented, skipping ....\n");
55+
return 0;
56+
}
57+
58+
if ((int)res.a0 < 0) {
59+
pr_info("ARCH_FEATURES(ARCH_SOC_ID) returned error: %lx\n",
60+
res.a0);
61+
return -EINVAL;
62+
}
63+
64+
arm_smccc_1_1_invoke(ARM_SMCCC_ARCH_SOC_ID, 0, &res);
65+
if ((int)res.a0 < 0) {
66+
pr_err("ARCH_SOC_ID(0) returned error: %lx\n", res.a0);
67+
return -EINVAL;
68+
}
69+
70+
soc_id_version = res.a0;
71+
72+
arm_smccc_1_1_invoke(ARM_SMCCC_ARCH_SOC_ID, 1, &res);
73+
if ((int)res.a0 < 0) {
74+
pr_err("ARCH_SOC_ID(1) returned error: %lx\n", res.a0);
75+
return -EINVAL;
76+
}
77+
78+
soc_id_rev = res.a0;
79+
80+
soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL);
81+
if (!soc_dev_attr)
82+
return -ENOMEM;
83+
84+
sprintf(soc_id_rev_str, "0x%08x", soc_id_rev);
85+
sprintf(soc_id_jep106_id_str, "jep106:%02x%02x",
86+
JEP106_BANK_CONT_CODE(soc_id_version),
87+
JEP106_ID_CODE(soc_id_version));
88+
sprintf(soc_id_str, "%s:%04x", soc_id_jep106_id_str,
89+
IMP_DEF_SOC_ID(soc_id_version));
90+
91+
soc_dev_attr->soc_id = soc_id_str;
92+
soc_dev_attr->revision = soc_id_rev_str;
93+
soc_dev_attr->family = soc_id_jep106_id_str;
94+
95+
soc_dev = soc_device_register(soc_dev_attr);
96+
if (IS_ERR(soc_dev)) {
97+
kfree(soc_dev_attr);
98+
return PTR_ERR(soc_dev);
99+
}
100+
101+
pr_info("ID = %s Revision = %s\n", soc_dev_attr->soc_id,
102+
soc_dev_attr->revision);
103+
104+
return 0;
105+
}
106+
module_init(smccc_soc_init);
107+
108+
static void __exit smccc_soc_exit(void)
109+
{
110+
if (soc_dev)
111+
soc_device_unregister(soc_dev);
112+
kfree(soc_dev_attr);
113+
}
114+
module_exit(smccc_soc_exit);

drivers/soc/ux500/ux500-soc-id.c

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -146,16 +146,24 @@ static const char * __init ux500_get_revision(void)
146146
return kasprintf(GFP_KERNEL, "%s", "Unknown");
147147
}
148148

149-
static ssize_t ux500_get_process(struct device *dev,
150-
struct device_attribute *attr,
151-
char *buf)
149+
static ssize_t
150+
process_show(struct device *dev, struct device_attribute *attr, char *buf)
152151
{
153152
if (dbx500_id.process == 0x00)
154153
return sprintf(buf, "Standard\n");
155154

156155
return sprintf(buf, "%02xnm\n", dbx500_id.process);
157156
}
158157

158+
static DEVICE_ATTR_RO(process);
159+
160+
static struct attribute *ux500_soc_attrs[] = {
161+
&dev_attr_process.attr,
162+
NULL
163+
};
164+
165+
ATTRIBUTE_GROUPS(ux500_soc);
166+
159167
static const char *db8500_read_soc_id(struct device_node *backupram)
160168
{
161169
void __iomem *base;
@@ -184,14 +192,11 @@ static void __init soc_info_populate(struct soc_device_attribute *soc_dev_attr,
184192
soc_dev_attr->machine = ux500_get_machine();
185193
soc_dev_attr->family = ux500_get_family();
186194
soc_dev_attr->revision = ux500_get_revision();
195+
soc_dev_attr->custom_attr_group = ux500_soc_groups[0];
187196
}
188197

189-
static const struct device_attribute ux500_soc_attr =
190-
__ATTR(process, S_IRUGO, ux500_get_process, NULL);
191-
192198
static int __init ux500_soc_device_init(void)
193199
{
194-
struct device *parent;
195200
struct soc_device *soc_dev;
196201
struct soc_device_attribute *soc_dev_attr;
197202
struct device_node *backupram;
@@ -217,9 +222,6 @@ static int __init ux500_soc_device_init(void)
217222
return PTR_ERR(soc_dev);
218223
}
219224

220-
parent = soc_device_to_device(soc_dev);
221-
device_create_file(parent, &ux500_soc_attr);
222-
223225
return 0;
224226
}
225227
subsys_initcall(ux500_soc_device_init);

drivers/soc/versatile/soc-integrator.c

Lines changed: 23 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -56,45 +56,47 @@ static const char *integrator_fpga_str(u32 id)
5656
}
5757
}
5858

59-
static ssize_t integrator_get_manf(struct device *dev,
60-
struct device_attribute *attr,
61-
char *buf)
59+
static ssize_t
60+
manufacturer_show(struct device *dev, struct device_attribute *attr, char *buf)
6261
{
6362
return sprintf(buf, "%02x\n", integrator_coreid >> 24);
6463
}
6564

66-
static struct device_attribute integrator_manf_attr =
67-
__ATTR(manufacturer, S_IRUGO, integrator_get_manf, NULL);
65+
static DEVICE_ATTR_RO(manufacturer);
6866

69-
static ssize_t integrator_get_arch(struct device *dev,
70-
struct device_attribute *attr,
71-
char *buf)
67+
static ssize_t
68+
arch_show(struct device *dev, struct device_attribute *attr, char *buf)
7269
{
7370
return sprintf(buf, "%s\n", integrator_arch_str(integrator_coreid));
7471
}
7572

76-
static struct device_attribute integrator_arch_attr =
77-
__ATTR(arch, S_IRUGO, integrator_get_arch, NULL);
73+
static DEVICE_ATTR_RO(arch);
7874

79-
static ssize_t integrator_get_fpga(struct device *dev,
80-
struct device_attribute *attr,
81-
char *buf)
75+
static ssize_t
76+
fpga_show(struct device *dev, struct device_attribute *attr, char *buf)
8277
{
8378
return sprintf(buf, "%s\n", integrator_fpga_str(integrator_coreid));
8479
}
8580

86-
static struct device_attribute integrator_fpga_attr =
87-
__ATTR(fpga, S_IRUGO, integrator_get_fpga, NULL);
81+
static DEVICE_ATTR_RO(fpga);
8882

89-
static ssize_t integrator_get_build(struct device *dev,
90-
struct device_attribute *attr,
91-
char *buf)
83+
static ssize_t
84+
build_show(struct device *dev, struct device_attribute *attr, char *buf)
9285
{
9386
return sprintf(buf, "%02x\n", (integrator_coreid >> 4) & 0xFF);
9487
}
9588

96-
static struct device_attribute integrator_build_attr =
97-
__ATTR(build, S_IRUGO, integrator_get_build, NULL);
89+
static DEVICE_ATTR_RO(build);
90+
91+
static struct attribute *integrator_attrs[] = {
92+
&dev_attr_manufacturer.attr,
93+
&dev_attr_arch.attr,
94+
&dev_attr_fpga.attr,
95+
&dev_attr_build.attr,
96+
NULL
97+
};
98+
99+
ATTRIBUTE_GROUPS(integrator);
98100

99101
static int __init integrator_soc_init(void)
100102
{
@@ -127,18 +129,14 @@ static int __init integrator_soc_init(void)
127129
soc_dev_attr->soc_id = "Integrator";
128130
soc_dev_attr->machine = "Integrator";
129131
soc_dev_attr->family = "Versatile";
132+
soc_dev_attr->custom_attr_group = integrator_groups[0];
130133
soc_dev = soc_device_register(soc_dev_attr);
131134
if (IS_ERR(soc_dev)) {
132135
kfree(soc_dev_attr);
133136
return -ENODEV;
134137
}
135138
dev = soc_device_to_device(soc_dev);
136139

137-
device_create_file(dev, &integrator_manf_attr);
138-
device_create_file(dev, &integrator_arch_attr);
139-
device_create_file(dev, &integrator_fpga_attr);
140-
device_create_file(dev, &integrator_build_attr);
141-
142140
dev_info(dev, "Detected ARM core module:\n");
143141
dev_info(dev, " Manufacturer: %02x\n", (val >> 24));
144142
dev_info(dev, " Architecture: %s\n", integrator_arch_str(val));

0 commit comments

Comments
 (0)