diff for duplicates of <20210729232205.GX8018@packtop> diff --git a/a/1.txt b/N1/1.txt index bd6a626..e19b964 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -12,13 +12,13 @@ On Thu, Jul 29, 2021 at 04:17:06PM CDT, Winiarska, Iwona wrote: >> > Signed-off-by: Iwona Winiarska <iwona.winiarska@intel.com> >> > Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> >> > --- ->> > drivers/peci/Kconfig??? |?? 1 + ->> > drivers/peci/core.c???? |? 49 +++++++++ ->> > drivers/peci/device.c?? |? 99 ++++++++++++++++++ ->> > drivers/peci/internal.h |? 75 ++++++++++++++ ->> > drivers/peci/request.c? | 217 ++++++++++++++++++++++++++++++++++++++++ ->> > include/linux/peci.h??? |? 19 ++++ ->> > lib/Kconfig???????????? |?? 2 +- +>> > drivers/peci/Kconfig | 1 + +>> > drivers/peci/core.c | 49 +++++++++ +>> > drivers/peci/device.c | 99 ++++++++++++++++++ +>> > drivers/peci/internal.h | 75 ++++++++++++++ +>> > drivers/peci/request.c | 217 ++++++++++++++++++++++++++++++++++++++++ +>> > include/linux/peci.h | 19 ++++ +>> > lib/Kconfig | 2 +- >> > 7 files changed, 461 insertions(+), 1 deletion(-) >> > >> > diff --git a/drivers/peci/Kconfig b/drivers/peci/Kconfig @@ -28,11 +28,11 @@ On Thu, Jul 29, 2021 at 04:17:06PM CDT, Winiarska, Iwona wrote: >> > @@ -2,6 +2,7 @@ >> > >> > menuconfig PECI ->> > ????????tristate "PECI support" ->> > +???????select GENERIC_LIB_X86 ->> > ????????help ->> > ????????? The Platform Environment Control Interface (PECI) is an interface ->> > ????????? that provides a communication channel to Intel processors and +>> > tristate "PECI support" +>> > + select GENERIC_LIB_X86 +>> > help +>> > The Platform Environment Control Interface (PECI) is an interface +>> > that provides a communication channel to Intel processors and >> > diff --git a/drivers/peci/core.c b/drivers/peci/core.c >> > index ae7a9572cdf3..94426b7f2618 100644 >> > --- a/drivers/peci/core.c @@ -46,57 +46,57 @@ On Thu, Jul 29, 2021 at 04:17:06PM CDT, Winiarska, Iwona wrote: >> > +peci_bus_match_device_id(const struct peci_device_id *id, struct >> > peci_device *device) >> > +{ ->> > +???????while (id->family != 0) { ->> > +???????????????if (id->family == device->info.family && ->> > +?????????????????? id->model == device->info.model) ->> > +???????????????????????return id; ->> > +???????????????id++; ->> > +???????} ->> > + ->> > +???????return NULL; +>> > + while (id->family != 0) { +>> > + if (id->family == device->info.family && +>> > + id->model == device->info.model) +>> > + return id; +>> > + id++; +>> > + } +>> > + +>> > + return NULL; >> > +} >> > + >> > +static int peci_bus_device_match(struct device *dev, struct device_driver >> > *drv) >> > +{ ->> > +???????struct peci_device *device = to_peci_device(dev); ->> > +???????struct peci_driver *peci_drv = to_peci_driver(drv); +>> > + struct peci_device *device = to_peci_device(dev); +>> > + struct peci_driver *peci_drv = to_peci_driver(drv); >> > + ->> > +???????if (dev->type != &peci_device_type) ->> > +???????????????return 0; +>> > + if (dev->type != &peci_device_type) +>> > + return 0; >> > + ->> > +???????if (peci_bus_match_device_id(peci_drv->id_table, device)) ->> > +???????????????return 1; +>> > + if (peci_bus_match_device_id(peci_drv->id_table, device)) +>> > + return 1; >> > + ->> > +???????return 0; +>> > + return 0; >> > +} >> > + >> > +static int peci_bus_device_probe(struct device *dev) >> > +{ ->> > +???????struct peci_device *device = to_peci_device(dev); ->> > +???????struct peci_driver *driver = to_peci_driver(dev->driver); +>> > + struct peci_device *device = to_peci_device(dev); +>> > + struct peci_driver *driver = to_peci_driver(dev->driver); >> > + ->> > +???????return driver->probe(device, peci_bus_match_device_id(driver- +>> > + return driver->probe(device, peci_bus_match_device_id(driver- >> > >id_table, device)); >> > +} >> > + >> > +static int peci_bus_device_remove(struct device *dev) >> > +{ ->> > +???????struct peci_device *device = to_peci_device(dev); ->> > +???????struct peci_driver *driver = to_peci_driver(dev->driver); +>> > + struct peci_device *device = to_peci_device(dev); +>> > + struct peci_driver *driver = to_peci_driver(dev->driver); >> > + ->> > +???????if (driver->remove) ->> > +???????????????driver->remove(device); +>> > + if (driver->remove) +>> > + driver->remove(device); >> > + ->> > +???????return 0; +>> > + return 0; >> > +} >> > + >> > struct bus_type peci_bus_type = { ->> > ????????.name???????????= "peci", ->> > +???????.match??????????= peci_bus_device_match, ->> > +???????.probe??????????= peci_bus_device_probe, ->> > +???????.remove?????????= peci_bus_device_remove, ->> > ????????.bus_groups?????= peci_bus_groups, +>> > .name = "peci", +>> > + .match = peci_bus_device_match, +>> > + .probe = peci_bus_device_probe, +>> > + .remove = peci_bus_device_remove, +>> > .bus_groups = peci_bus_groups, >> > }; >> > >> > diff --git a/drivers/peci/device.c b/drivers/peci/device.c @@ -117,19 +117,19 @@ On Thu, Jul 29, 2021 at 04:17:06PM CDT, Winiarska, Iwona wrote: >> > +#define REVISION_NUM_MASK GENMASK(15, 8) >> > +static int peci_get_revision(struct peci_device *device, u8 *revision) >> > +{ ->> > +???????struct peci_request *req; ->> > +???????u64 dib; +>> > + struct peci_request *req; +>> > + u64 dib; >> > + ->> > +???????req = peci_get_dib(device); ->> > +???????if (IS_ERR(req)) ->> > +???????????????return PTR_ERR(req); +>> > + req = peci_get_dib(device); +>> > + if (IS_ERR(req)) +>> > + return PTR_ERR(req); >> > + ->> > +???????dib = peci_request_data_dib(req); ->> > +???????if (dib == 0) { ->> > +???????????????peci_request_free(req); ->> > +???????????????return -EIO; +>> > + dib = peci_request_data_dib(req); +>> > + if (dib == 0) { +>> > + peci_request_free(req); +>> > + return -EIO; >> ->> Any particular reason to check for zero specifically here?? It looks +>> Any particular reason to check for zero specifically here? It looks >> like that would be a case where the host CPU responds and everything's >> otherwise fine, but the host just happened to send back a bunch of zeros >> for whatever reason -- which may not be a valid PECI revision number, @@ -169,30 +169,30 @@ I suppose it facilitates an easy zero check, but that could also be written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >> ->> > +???????} +>> > + } >> > + ->> > +???????*revision = FIELD_GET(REVISION_NUM_MASK, dib); +>> > + *revision = FIELD_GET(REVISION_NUM_MASK, dib); >> > + ->> > +???????peci_request_free(req); +>> > + peci_request_free(req); >> > + ->> > +???????return 0; +>> > + return 0; >> > +} >> > + >> > +static int peci_get_cpu_id(struct peci_device *device, u32 *cpu_id) >> > +{ ->> > +???????struct peci_request *req; ->> > +???????int ret; +>> > + struct peci_request *req; +>> > + int ret; >> > + ->> > +???????req = peci_pkg_cfg_readl(device, PECI_PCS_PKG_ID, +>> > + req = peci_pkg_cfg_readl(device, PECI_PCS_PKG_ID, >> > PECI_PKG_ID_CPU_ID); ->> > +???????if (IS_ERR(req)) ->> > +???????????????return PTR_ERR(req); +>> > + if (IS_ERR(req)) +>> > + return PTR_ERR(req); >> > + ->> > +???????ret = peci_request_status(req); ->> > +???????if (ret) ->> > +???????????????goto out_req_free; +>> > + ret = peci_request_status(req); +>> > + if (ret) +>> > + goto out_req_free; >> > + ->> > +???????*cpu_id = peci_request_data_readl(req); +>> > + *cpu_id = peci_request_data_readl(req); >> > +out_req_free: >> >> As suggested on patch #8, I think it might be cleaner to stack-allocate @@ -200,8 +200,8 @@ written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >> calls in functions like this and hence might simplify it away entirely, >> but if this does remain like this we could just do >> ->> ????????if (!ret) ->> ????????????????*cpu_id = peci_request_data_readl(req); +>> if (!ret) +>> *cpu_id = peci_request_data_readl(req); >> >> instead of using a goto to skip a single line. > @@ -211,87 +211,87 @@ written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >case of peci requests. > >> ->> > +???????peci_request_free(req); +>> > + peci_request_free(req); >> > + ->> > +???????return ret; +>> > + return ret; >> > +} >> > + >> > +static int peci_device_info_init(struct peci_device *device) >> > +{ ->> > +???????u8 revision; ->> > +???????u32 cpu_id; ->> > +???????int ret; +>> > + u8 revision; +>> > + u32 cpu_id; +>> > + int ret; >> > + ->> > +???????ret = peci_get_cpu_id(device, &cpu_id); ->> > +???????if (ret) ->> > +???????????????return ret; +>> > + ret = peci_get_cpu_id(device, &cpu_id); +>> > + if (ret) +>> > + return ret; >> > + ->> > +???????device->info.family = x86_family(cpu_id); ->> > +???????device->info.model = x86_model(cpu_id); +>> > + device->info.family = x86_family(cpu_id); +>> > + device->info.model = x86_model(cpu_id); >> > + ->> > +???????ret = peci_get_revision(device, &revision); ->> > +???????if (ret) ->> > +???????????????return ret; ->> > +???????device->info.peci_revision = revision; +>> > + ret = peci_get_revision(device, &revision); +>> > + if (ret) +>> > + return ret; +>> > + device->info.peci_revision = revision; >> > + ->> > +???????device->info.socket_id = device->addr - PECI_BASE_ADDR; +>> > + device->info.socket_id = device->addr - PECI_BASE_ADDR; >> > + ->> > +???????return 0; +>> > + return 0; >> > +} >> > + >> > static int peci_detect(struct peci_controller *controller, u8 addr) >> > { ->> > ????????struct peci_request *req; +>> > struct peci_request *req; >> > @@ -75,6 +143,10 @@ int peci_device_create(struct peci_controller >> > *controller, u8 addr) ->> > ????????device->dev.bus = &peci_bus_type; ->> > ????????device->dev.type = &peci_device_type; +>> > device->dev.bus = &peci_bus_type; +>> > device->dev.type = &peci_device_type; >> > ->> > +???????ret = peci_device_info_init(device); ->> > +???????if (ret) ->> > +???????????????goto err_free; +>> > + ret = peci_device_info_init(device); +>> > + if (ret) +>> > + goto err_free; >> > + ->> > ????????ret = dev_set_name(&device->dev, "%d-%02x", controller->id, device- +>> > ret = dev_set_name(&device->dev, "%d-%02x", controller->id, device- >> > >addr); ->> > ????????if (ret) ->> > ????????????????goto err_free; +>> > if (ret) +>> > goto err_free; >> > @@ -98,6 +170,33 @@ void peci_device_destroy(struct peci_device *device) ->> > ????????device_unregister(&device->dev); +>> > device_unregister(&device->dev); >> > } >> > >> > +int __peci_driver_register(struct peci_driver *driver, struct module >> > *owner, ->> > +????????????????????????? const char *mod_name) +>> > + const char *mod_name) >> > +{ ->> > +???????driver->driver.bus = &peci_bus_type; ->> > +???????driver->driver.owner = owner; ->> > +???????driver->driver.mod_name = mod_name; +>> > + driver->driver.bus = &peci_bus_type; +>> > + driver->driver.owner = owner; +>> > + driver->driver.mod_name = mod_name; >> > + ->> > +???????if (!driver->probe) { ->> > +???????????????pr_err("peci: trying to register driver without probe +>> > + if (!driver->probe) { +>> > + pr_err("peci: trying to register driver without probe >> > callback\n"); ->> > +???????????????return -EINVAL; ->> > +???????} +>> > + return -EINVAL; +>> > + } >> > + ->> > +???????if (!driver->id_table) { ->> > +???????????????pr_err("peci: trying to register driver without device id +>> > + if (!driver->id_table) { +>> > + pr_err("peci: trying to register driver without device id >> > table\n"); ->> > +???????????????return -EINVAL; ->> > +???????} +>> > + return -EINVAL; +>> > + } >> > + ->> > +???????return driver_register(&driver->driver); +>> > + return driver_register(&driver->driver); >> > +} >> > +EXPORT_SYMBOL_NS_GPL(__peci_driver_register, PECI); >> > + >> > +void peci_driver_unregister(struct peci_driver *driver) >> > +{ ->> > +???????driver_unregister(&driver->driver); +>> > + driver_unregister(&driver->driver); >> > +} >> > +EXPORT_SYMBOL_NS_GPL(peci_driver_unregister, PECI); >> > + >> > static void peci_device_release(struct device *dev) >> > { ->> > ????????struct peci_device *device = to_peci_device(dev); +>> > struct peci_device *device = to_peci_device(dev); >> > diff --git a/drivers/peci/internal.h b/drivers/peci/internal.h >> > index 6b139adaf6b8..c891c93e077a 100644 >> > --- a/drivers/peci/internal.h @@ -328,9 +328,9 @@ written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >> > + * @model: device model >> > + */ >> > +struct peci_device_id { ->> > +???????const void *data; ->> > +???????u16 family; ->> > +???????u8 model; +>> > + const void *data; +>> > + u16 family; +>> > + u8 model; >> > +}; >> > + >> > extern struct device_type peci_device_type; @@ -348,21 +348,21 @@ written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >> > + * @id_table: PECI device match table to decide which device to bind >> > + */ >> > +struct peci_driver { ->> > +???????struct device_driver driver; ->> > +???????int (*probe)(struct peci_device *device, const struct peci_device_id +>> > + struct device_driver driver; +>> > + int (*probe)(struct peci_device *device, const struct peci_device_id >> > *id); ->> > +???????void (*remove)(struct peci_device *device); ->> > +???????const struct peci_device_id *id_table; +>> > + void (*remove)(struct peci_device *device); +>> > + const struct peci_device_id *id_table; >> > +}; >> > + >> > +static inline struct peci_driver *to_peci_driver(struct device_driver *d) >> > +{ ->> > +???????return container_of(d, struct peci_driver, driver); +>> > + return container_of(d, struct peci_driver, driver); >> > +} >> > + >> > +int __peci_driver_register(struct peci_driver *driver, struct module >> > *owner, ->> > +????????????????????????? const char *mod_name); +>> > + const char *mod_name); >> > +/** >> > + * peci_driver_register() - register PECI driver >> > + * @driver: the driver to be registered @@ -376,7 +376,7 @@ written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >> > + * Return: zero on success, else a negative error code. >> > + */ >> > +#define peci_driver_register(driver) \ ->> > +???????__peci_driver_register(driver, THIS_MODULE, KBUILD_MODNAME) +>> > + __peci_driver_register(driver, THIS_MODULE, KBUILD_MODNAME) >> > +void peci_driver_unregister(struct peci_driver *driver); >> > + >> > +/** @@ -390,7 +390,7 @@ written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >> > module_exit() >> > + */ >> > +#define module_peci_driver(__peci_driver) \ ->> > +???????module_driver(__peci_driver, peci_driver_register, +>> > + module_driver(__peci_driver, peci_driver_register, >> > peci_driver_unregister) >> > + >> > extern struct device_type peci_controller_type; @@ -414,39 +414,39 @@ written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >> > + >> > #include "internal.h" >> > ->> > +#define PECI_GET_DIB_CMD???????????????0xf7 ->> > +#define? PECI_GET_DIB_WR_LEN???????????1 ->> > +#define? PECI_GET_DIB_RD_LEN???????????8 +>> > +#define PECI_GET_DIB_CMD 0xf7 +>> > +#define PECI_GET_DIB_WR_LEN 1 +>> > +#define PECI_GET_DIB_RD_LEN 8 >> > + ->> > +#define PECI_RDPKGCFG_CMD??????????????0xa1 ->> > +#define? PECI_RDPKGCFG_WRITE_LEN???????5 ->> > +#define? PECI_RDPKGCFG_READ_LEN_BASE???1 ->> > +#define PECI_WRPKGCFG_CMD??????????????0xa5 ->> > +#define? PECI_WRPKGCFG_WRITE_LEN_BASE??6 ->> > +#define? PECI_WRPKGCFG_READ_LEN????????????????1 +>> > +#define PECI_RDPKGCFG_CMD 0xa1 +>> > +#define PECI_RDPKGCFG_WRITE_LEN 5 +>> > +#define PECI_RDPKGCFG_READ_LEN_BASE 1 +>> > +#define PECI_WRPKGCFG_CMD 0xa5 +>> > +#define PECI_WRPKGCFG_WRITE_LEN_BASE 6 +>> > +#define PECI_WRPKGCFG_READ_LEN 1 >> > + >> > +/* Device Specific Completion Code (CC) Definition */ ->> > +#define PECI_CC_SUCCESS????????????????????????????????0x40 ->> > +#define PECI_CC_NEED_RETRY?????????????????????0x80 ->> > +#define PECI_CC_OUT_OF_RESOURCE????????????????????????0x81 ->> > +#define PECI_CC_UNAVAIL_RESOURCE???????????????0x82 ->> > +#define PECI_CC_INVALID_REQ????????????????????0x90 ->> > +#define PECI_CC_MCA_ERROR??????????????????????0x91 ->> > +#define PECI_CC_CATASTROPHIC_MCA_ERROR?????????0x93 ->> > +#define PECI_CC_FATAL_MCA_ERROR????????????????????????0x94 ->> > +#define PECI_CC_PARITY_ERR_GPSB_OR_PMSB????????????????0x98 ->> > +#define PECI_CC_PARITY_ERR_GPSB_OR_PMSB_IERR???0x9B ->> > +#define PECI_CC_PARITY_ERR_GPSB_OR_PMSB_MCA????0x9C ->> > + ->> > +#define PECI_RETRY_BIT?????????????????BIT(0) ->> > + ->> > +#define PECI_RETRY_TIMEOUT?????????????msecs_to_jiffies(700) ->> > +#define PECI_RETRY_INTERVAL_MIN????????????????msecs_to_jiffies(1) ->> > +#define PECI_RETRY_INTERVAL_MAX????????????????msecs_to_jiffies(128) +>> > +#define PECI_CC_SUCCESS 0x40 +>> > +#define PECI_CC_NEED_RETRY 0x80 +>> > +#define PECI_CC_OUT_OF_RESOURCE 0x81 +>> > +#define PECI_CC_UNAVAIL_RESOURCE 0x82 +>> > +#define PECI_CC_INVALID_REQ 0x90 +>> > +#define PECI_CC_MCA_ERROR 0x91 +>> > +#define PECI_CC_CATASTROPHIC_MCA_ERROR 0x93 +>> > +#define PECI_CC_FATAL_MCA_ERROR 0x94 +>> > +#define PECI_CC_PARITY_ERR_GPSB_OR_PMSB 0x98 +>> > +#define PECI_CC_PARITY_ERR_GPSB_OR_PMSB_IERR 0x9B +>> > +#define PECI_CC_PARITY_ERR_GPSB_OR_PMSB_MCA 0x9C +>> > + +>> > +#define PECI_RETRY_BIT BIT(0) +>> > + +>> > +#define PECI_RETRY_TIMEOUT msecs_to_jiffies(700) +>> > +#define PECI_RETRY_INTERVAL_MIN msecs_to_jiffies(1) +>> > +#define PECI_RETRY_INTERVAL_MAX msecs_to_jiffies(128) >> > + >> > +static u8 peci_request_data_cc(struct peci_request *req) >> > +{ ->> > +???????return req->rx.buf[0]; +>> > + return req->rx.buf[0]; >> > +} >> > + >> > +/** @@ -461,175 +461,175 @@ written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >> > + */ >> > +int peci_request_status(struct peci_request *req) >> > +{ ->> > +???????u8 cc = peci_request_data_cc(req); ->> > + ->> > +???????if (cc != PECI_CC_SUCCESS) ->> > +???????????????dev_dbg(&req->device->dev, "ret: %#02x\n", cc); ->> > + ->> > +???????switch (cc) { ->> > +???????case PECI_CC_SUCCESS: ->> > +???????????????return 0; ->> > +???????case PECI_CC_NEED_RETRY: ->> > +???????case PECI_CC_OUT_OF_RESOURCE: ->> > +???????case PECI_CC_UNAVAIL_RESOURCE: ->> > +???????????????return -EAGAIN; ->> > +???????case PECI_CC_INVALID_REQ: ->> > +???????????????return -EINVAL; ->> > +???????case PECI_CC_MCA_ERROR: ->> > +???????case PECI_CC_CATASTROPHIC_MCA_ERROR: ->> > +???????case PECI_CC_FATAL_MCA_ERROR: ->> > +???????case PECI_CC_PARITY_ERR_GPSB_OR_PMSB: ->> > +???????case PECI_CC_PARITY_ERR_GPSB_OR_PMSB_IERR: ->> > +???????case PECI_CC_PARITY_ERR_GPSB_OR_PMSB_MCA: ->> > +???????????????return -EIO; ->> > +???????} ->> > + ->> > +???????WARN_ONCE(1, "Unknown PECI completion code: %#02x\n", cc); ->> > + ->> > +???????return -EIO; +>> > + u8 cc = peci_request_data_cc(req); +>> > + +>> > + if (cc != PECI_CC_SUCCESS) +>> > + dev_dbg(&req->device->dev, "ret: %#02x\n", cc); +>> > + +>> > + switch (cc) { +>> > + case PECI_CC_SUCCESS: +>> > + return 0; +>> > + case PECI_CC_NEED_RETRY: +>> > + case PECI_CC_OUT_OF_RESOURCE: +>> > + case PECI_CC_UNAVAIL_RESOURCE: +>> > + return -EAGAIN; +>> > + case PECI_CC_INVALID_REQ: +>> > + return -EINVAL; +>> > + case PECI_CC_MCA_ERROR: +>> > + case PECI_CC_CATASTROPHIC_MCA_ERROR: +>> > + case PECI_CC_FATAL_MCA_ERROR: +>> > + case PECI_CC_PARITY_ERR_GPSB_OR_PMSB: +>> > + case PECI_CC_PARITY_ERR_GPSB_OR_PMSB_IERR: +>> > + case PECI_CC_PARITY_ERR_GPSB_OR_PMSB_MCA: +>> > + return -EIO; +>> > + } +>> > + +>> > + WARN_ONCE(1, "Unknown PECI completion code: %#02x\n", cc); +>> > + +>> > + return -EIO; >> > +} >> > +EXPORT_SYMBOL_NS_GPL(peci_request_status, PECI); >> > + >> > +static int peci_request_xfer(struct peci_request *req) >> > +{ ->> > +???????struct peci_device *device = req->device; ->> > +???????struct peci_controller *controller = device->controller; ->> > +???????int ret; +>> > + struct peci_device *device = req->device; +>> > + struct peci_controller *controller = device->controller; +>> > + int ret; >> > + ->> > +???????mutex_lock(&controller->bus_lock); ->> > +???????ret = controller->xfer(controller, device->addr, req); ->> > +???????mutex_unlock(&controller->bus_lock); +>> > + mutex_lock(&controller->bus_lock); +>> > + ret = controller->xfer(controller, device->addr, req); +>> > + mutex_unlock(&controller->bus_lock); >> > + ->> > +???????return ret; +>> > + return ret; >> > +} >> > + >> > +static int peci_request_xfer_retry(struct peci_request *req) >> > +{ ->> > +???????long wait_interval = PECI_RETRY_INTERVAL_MIN; ->> > +???????struct peci_device *device = req->device; ->> > +???????struct peci_controller *controller = device->controller; ->> > +???????unsigned long start = jiffies; ->> > +???????int ret; ->> > + ->> > +???????/* Don't try to use it for ping */ ->> > +???????if (WARN_ON(!req->rx.buf)) ->> > +???????????????return 0; ->> > + ->> > +???????do { ->> > +???????????????ret = peci_request_xfer(req); ->> > +???????????????if (ret) { ->> > +???????????????????????dev_dbg(&controller->dev, "xfer error: %d\n", ret); ->> > +???????????????????????return ret; ->> > +???????????????} ->> > + ->> > +???????????????if (peci_request_status(req) != -EAGAIN) ->> > +???????????????????????return 0; ->> > + ->> > +???????????????/* Set the retry bit to indicate a retry attempt */ ->> > +???????????????req->tx.buf[1] |= PECI_RETRY_BIT; ->> > + ->> > +???????????????if (schedule_timeout_interruptible(wait_interval)) ->> > +???????????????????????return -ERESTARTSYS; ->> > + ->> > +???????????????wait_interval *= 2; ->> > +???????????????if (wait_interval > PECI_RETRY_INTERVAL_MAX) ->> > +???????????????????????wait_interval = PECI_RETRY_INTERVAL_MAX; +>> > + long wait_interval = PECI_RETRY_INTERVAL_MIN; +>> > + struct peci_device *device = req->device; +>> > + struct peci_controller *controller = device->controller; +>> > + unsigned long start = jiffies; +>> > + int ret; +>> > + +>> > + /* Don't try to use it for ping */ +>> > + if (WARN_ON(!req->rx.buf)) +>> > + return 0; +>> > + +>> > + do { +>> > + ret = peci_request_xfer(req); +>> > + if (ret) { +>> > + dev_dbg(&controller->dev, "xfer error: %d\n", ret); +>> > + return ret; +>> > + } +>> > + +>> > + if (peci_request_status(req) != -EAGAIN) +>> > + return 0; +>> > + +>> > + /* Set the retry bit to indicate a retry attempt */ +>> > + req->tx.buf[1] |= PECI_RETRY_BIT; +>> > + +>> > + if (schedule_timeout_interruptible(wait_interval)) +>> > + return -ERESTARTSYS; +>> > + +>> > + wait_interval *= 2; +>> > + if (wait_interval > PECI_RETRY_INTERVAL_MAX) +>> > + wait_interval = PECI_RETRY_INTERVAL_MAX; >> >> wait_interval = min(wait_interval * 2, PECI_RETRY_INTERVAL_MAX) ? > >Ack. > >> ->> > +???????} while (time_before(jiffies, start + PECI_RETRY_TIMEOUT)); +>> > + } while (time_before(jiffies, start + PECI_RETRY_TIMEOUT)); >> > + ->> > +???????dev_dbg(&controller->dev, "request timed out\n"); +>> > + dev_dbg(&controller->dev, "request timed out\n"); >> > + ->> > +???????return -ETIMEDOUT; +>> > + return -ETIMEDOUT; >> > +} >> > + >> > /** ->> > ?* peci_request_alloc() - allocate &struct peci_request with buffers with +>> > * peci_request_alloc() - allocate &struct peci_request with buffers with >> > given lengths ->> > ?* @device: PECI device to which request is going to be sent +>> > * @device: PECI device to which request is going to be sent >> > @@ -72,3 +201,91 @@ void peci_request_free(struct peci_request *req) ->> > ????????kfree(req); +>> > kfree(req); >> > } >> > EXPORT_SYMBOL_NS_GPL(peci_request_free, PECI); >> > + >> > +struct peci_request *peci_get_dib(struct peci_device *device) >> > +{ ->> > +???????struct peci_request *req; ->> > +???????int ret; +>> > + struct peci_request *req; +>> > + int ret; >> > + ->> > +???????req = peci_request_alloc(device, PECI_GET_DIB_WR_LEN, +>> > + req = peci_request_alloc(device, PECI_GET_DIB_WR_LEN, >> > PECI_GET_DIB_RD_LEN); ->> > +???????if (!req) ->> > +???????????????return ERR_PTR(-ENOMEM); +>> > + if (!req) +>> > + return ERR_PTR(-ENOMEM); >> > + ->> > +???????req->tx.buf[0] = PECI_GET_DIB_CMD; +>> > + req->tx.buf[0] = PECI_GET_DIB_CMD; >> > + ->> > +???????ret = peci_request_xfer(req); ->> > +???????if (ret) { ->> > +???????????????peci_request_free(req); ->> > +???????????????return ERR_PTR(ret); ->> > +???????} +>> > + ret = peci_request_xfer(req); +>> > + if (ret) { +>> > + peci_request_free(req); +>> > + return ERR_PTR(ret); +>> > + } >> > + ->> > +???????return req; +>> > + return req; >> > +} >> > +EXPORT_SYMBOL_NS_GPL(peci_get_dib, PECI); >> > + >> > +static struct peci_request * >> > +__pkg_cfg_read(struct peci_device *device, u8 index, u16 param, u8 len) >> > +{ ->> > +???????struct peci_request *req; ->> > +???????int ret; ->> > + ->> > +???????req = peci_request_alloc(device, PECI_RDPKGCFG_WRITE_LEN, ->> > +??????????????????????????????? PECI_RDPKGCFG_READ_LEN_BASE + len); ->> > +???????if (!req) ->> > +???????????????return ERR_PTR(-ENOMEM); ->> > + ->> > +???????req->tx.buf[0] = PECI_RDPKGCFG_CMD; ->> > +???????req->tx.buf[1] = 0; ->> > +???????req->tx.buf[2] = index; ->> > +???????put_unaligned_le16(param, &req->tx.buf[3]); ->> > + ->> > +???????ret = peci_request_xfer_retry(req); ->> > +???????if (ret) { ->> > +???????????????peci_request_free(req); ->> > +???????????????return ERR_PTR(ret); ->> > +???????} ->> > + ->> > +???????return req; +>> > + struct peci_request *req; +>> > + int ret; +>> > + +>> > + req = peci_request_alloc(device, PECI_RDPKGCFG_WRITE_LEN, +>> > + PECI_RDPKGCFG_READ_LEN_BASE + len); +>> > + if (!req) +>> > + return ERR_PTR(-ENOMEM); +>> > + +>> > + req->tx.buf[0] = PECI_RDPKGCFG_CMD; +>> > + req->tx.buf[1] = 0; +>> > + req->tx.buf[2] = index; +>> > + put_unaligned_le16(param, &req->tx.buf[3]); +>> > + +>> > + ret = peci_request_xfer_retry(req); +>> > + if (ret) { +>> > + peci_request_free(req); +>> > + return ERR_PTR(ret); +>> > + } +>> > + +>> > + return req; >> > +} >> > + >> > +u8 peci_request_data_readb(struct peci_request *req) >> > +{ ->> > +???????return req->rx.buf[1]; +>> > + return req->rx.buf[1]; >> > +} >> > +EXPORT_SYMBOL_NS_GPL(peci_request_data_readb, PECI); >> > + >> > +u16 peci_request_data_readw(struct peci_request *req) >> > +{ ->> > +???????return get_unaligned_le16(&req->rx.buf[1]); +>> > + return get_unaligned_le16(&req->rx.buf[1]); >> > +} >> > +EXPORT_SYMBOL_NS_GPL(peci_request_data_readw, PECI); >> > + >> > +u32 peci_request_data_readl(struct peci_request *req) >> > +{ ->> > +???????return get_unaligned_le32(&req->rx.buf[1]); +>> > + return get_unaligned_le32(&req->rx.buf[1]); >> > +} >> > +EXPORT_SYMBOL_NS_GPL(peci_request_data_readl, PECI); >> > + >> > +u64 peci_request_data_readq(struct peci_request *req) >> > +{ ->> > +???????return get_unaligned_le64(&req->rx.buf[1]); +>> > + return get_unaligned_le64(&req->rx.buf[1]); >> > +} >> > +EXPORT_SYMBOL_NS_GPL(peci_request_data_readq, PECI); >> > + >> > +u64 peci_request_data_dib(struct peci_request *req) >> > +{ ->> > +???????return get_unaligned_le64(&req->rx.buf[0]); +>> > + return get_unaligned_le64(&req->rx.buf[0]); >> > +} >> > +EXPORT_SYMBOL_NS_GPL(peci_request_data_dib, PECI); >> > + @@ -637,10 +637,10 @@ written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >> > +struct peci_request *peci_pkg_cfg_##x(struct peci_device *device, u8 index, >> > u16 param) \ >> > +{ \ ->> > +???????return __pkg_cfg_read(device, index, param, sizeof(type)); \ +>> > + return __pkg_cfg_read(device, index, param, sizeof(type)); \ >> > +} \ >> ->> Is there a reason for this particular API?? I'd think a more natural one +>> Is there a reason for this particular API? I'd think a more natural one >> that would offload a bit of boilerplate from callers would look more like >> >> int peci_pkg_cfg_##x(struct peci_device *device, u8 index, u16 param, type @@ -672,42 +672,42 @@ written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >> > #include <linux/mutex.h> >> > #include <linux/types.h> >> > ->> > +#define PECI_PCS_PKG_ID????????????????????????0? /* Package Identifier +>> > +#define PECI_PCS_PKG_ID 0 /* Package Identifier >> > Read */ ->> > +#define? PECI_PKG_ID_CPU_ID????????????0x0000? /* CPUID Info */ ->> > +#define? PECI_PKG_ID_PLATFORM_ID???????0x0001? /* Platform ID */ ->> > +#define? PECI_PKG_ID_DEVICE_ID?????????0x0002? /* Uncore Device ID */ ->> > +#define? PECI_PKG_ID_MAX_THREAD_ID?????0x0003? /* Max Thread ID */ ->> > +#define? PECI_PKG_ID_MICROCODE_REV?????0x0004? /* CPU Microcode Update +>> > +#define PECI_PKG_ID_CPU_ID 0x0000 /* CPUID Info */ +>> > +#define PECI_PKG_ID_PLATFORM_ID 0x0001 /* Platform ID */ +>> > +#define PECI_PKG_ID_DEVICE_ID 0x0002 /* Uncore Device ID */ +>> > +#define PECI_PKG_ID_MAX_THREAD_ID 0x0003 /* Max Thread ID */ +>> > +#define PECI_PKG_ID_MICROCODE_REV 0x0004 /* CPU Microcode Update >> > Revision */ ->> > +#define? PECI_PKG_ID_MCA_ERROR_LOG?????0x0005? /* Machine Check Status */ +>> > +#define PECI_PKG_ID_MCA_ERROR_LOG 0x0005 /* Machine Check Status */ >> > + >> > struct peci_request; >> > >> > /** >> > @@ -41,6 +49,11 @@ static inline struct peci_controller >> > *to_peci_controller(void *d) ->> > ?* struct peci_device - PECI device ->> > ?* @dev: device object to register PECI device to the device model ->> > ?* @controller: manages the bus segment hosting this PECI device +>> > * struct peci_device - PECI device +>> > * @dev: device object to register PECI device to the device model +>> > * @controller: manages the bus segment hosting this PECI device >> > + * @info: PECI device characteristics >> > + * @info.family: device family >> > + * @info.model: device model >> > + * @info.peci_revision: PECI revision supported by the PECI device >> > + * @info.socket_id: the socket ID represented by the PECI device ->> > ?* @addr: address used on the PECI bus connected to the parent controller ->> > ?* ->> > ?* A peci_device identifies a single device (i.e. CPU) connected to a PECI +>> > * @addr: address used on the PECI bus connected to the parent controller +>> > * +>> > * A peci_device identifies a single device (i.e. CPU) connected to a PECI >> > bus. >> > @@ -50,6 +63,12 @@ static inline struct peci_controller >> > *to_peci_controller(void *d) >> > struct peci_device { ->> > ????????struct device dev; ->> > ????????struct peci_controller *controller; ->> > +???????struct { ->> > +???????????????u16 family; ->> > +???????????????u8 model; ->> > +???????????????u8 peci_revision; +>> > struct device dev; +>> > struct peci_controller *controller; +>> > + struct { +>> > + u16 family; +>> > + u8 model; +>> > + u8 peci_revision; >> >> This field gets set but doesn't seem to end up used anywhere; is it >> useful? @@ -722,9 +722,9 @@ written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >-Iwona > >> ->> > +???????????????u8 socket_id; ->> > +???????} info; ->> > ????????u8 addr; +>> > + u8 socket_id; +>> > + } info; +>> > u8 addr; >> > }; >> > >> > diff --git a/lib/Kconfig b/lib/Kconfig @@ -734,10 +734,10 @@ written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >> > @@ -721,5 +721,5 @@ config ASN1_ENCODER >> > >> > config GENERIC_LIB_X86 ->> > ????????bool ->> > -???????depends on X86 ->> > +???????depends on X86 || PECI ->> > ????????default n +>> > bool +>> > - depends on X86 +>> > + depends on X86 || PECI +>> > default n >> > -- >> > 2.31.1 > diff --git a/a/content_digest b/N1/content_digest index 315ee2f..4077ab7 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -3,9 +3,36 @@ "ref\020210727201028.GS8018@packtop\0" "ref\079f5b6ed4942ddeb66beea03907a58495376ccef.camel@intel.com\0" "From\0Zev Weiss <zweiss@equinix.com>\0" - "Subject\0[PATCH 09/14] peci: Add support for PECI device drivers\0" + "Subject\0Re: [PATCH 09/14] peci: Add support for PECI device drivers\0" "Date\0Thu, 29 Jul 2021 23:22:06 +0000\0" - "To\0linux-aspeed@lists.ozlabs.org\0" + "To\0Winiarska" + " Iwona <iwona.winiarska@intel.com>\0" + "Cc\0corbet@lwn.net <corbet@lwn.net>" + jae.hyun.yoo@linux.intel.com <jae.hyun.yoo@linux.intel.com> + Lutomirski + Andy <luto@kernel.org> + linux-hwmon@vger.kernel.org <linux-hwmon@vger.kernel.org> + Luck + Tony <tony.luck@intel.com> + andrew@aj.id.au <andrew@aj.id.au> + mchehab@kernel.org <mchehab@kernel.org> + jdelvare@suse.com <jdelvare@suse.com> + linux-kernel@vger.kernel.org <linux-kernel@vger.kernel.org> + mingo@redhat.com <mingo@redhat.com> + devicetree@vger.kernel.org <devicetree@vger.kernel.org> + tglx@linutronix.de <tglx@linutronix.de> + linux@roeck-us.net <linux@roeck-us.net> + linux-aspeed@lists.ozlabs.org <linux-aspeed@lists.ozlabs.org> + linux-doc@vger.kernel.org <linux-doc@vger.kernel.org> + yazen.ghannam@amd.com <yazen.ghannam@amd.com> + robh+dt@kernel.org <robh+dt@kernel.org> + openbmc@lists.ozlabs.org <openbmc@lists.ozlabs.org> + bp@alien8.de <bp@alien8.de> + linux-arm-kernel@lists.infradead.org <linux-arm-kernel@lists.infradead.org> + pierre-louis.bossart@linux.intel.com <pierre-louis.bossart@linux.intel.com> + andriy.shevchenko@linux.intel.com <andriy.shevchenko@linux.intel.com> + x86@kernel.org <x86@kernel.org> + " gregkh@linuxfoundation.org <gregkh@linuxfoundation.org>\0" "\00:1\0" "b\0" "On Thu, Jul 29, 2021 at 04:17:06PM CDT, Winiarska, Iwona wrote:\n" @@ -22,13 +49,13 @@ ">> > Signed-off-by: Iwona Winiarska <iwona.winiarska@intel.com>\n" ">> > Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>\n" ">> > ---\n" - ">> > drivers/peci/Kconfig??? |?? 1 +\n" - ">> > drivers/peci/core.c???? |? 49 +++++++++\n" - ">> > drivers/peci/device.c?? |? 99 ++++++++++++++++++\n" - ">> > drivers/peci/internal.h |? 75 ++++++++++++++\n" - ">> > drivers/peci/request.c? | 217 ++++++++++++++++++++++++++++++++++++++++\n" - ">> > include/linux/peci.h??? |? 19 ++++\n" - ">> > lib/Kconfig???????????? |?? 2 +-\n" + ">> > drivers/peci/Kconfig\302\240\302\240\302\240 |\302\240\302\240 1 +\n" + ">> > drivers/peci/core.c\302\240\302\240\302\240\302\240 |\302\240 49 +++++++++\n" + ">> > drivers/peci/device.c\302\240\302\240 |\302\240 99 ++++++++++++++++++\n" + ">> > drivers/peci/internal.h |\302\240 75 ++++++++++++++\n" + ">> > drivers/peci/request.c\302\240 | 217 ++++++++++++++++++++++++++++++++++++++++\n" + ">> > include/linux/peci.h\302\240\302\240\302\240 |\302\240 19 ++++\n" + ">> > lib/Kconfig\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 |\302\240\302\240 2 +-\n" ">> > 7 files changed, 461 insertions(+), 1 deletion(-)\n" ">> >\n" ">> > diff --git a/drivers/peci/Kconfig b/drivers/peci/Kconfig\n" @@ -38,11 +65,11 @@ ">> > @@ -2,6 +2,7 @@\n" ">> >\n" ">> > menuconfig PECI\n" - ">> > ????????tristate \"PECI support\"\n" - ">> > +???????select GENERIC_LIB_X86\n" - ">> > ????????help\n" - ">> > ????????? The Platform Environment Control Interface (PECI) is an interface\n" - ">> > ????????? that provides a communication channel to Intel processors and\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240tristate \"PECI support\"\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240select GENERIC_LIB_X86\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240help\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 The Platform Environment Control Interface (PECI) is an interface\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 that provides a communication channel to Intel processors and\n" ">> > diff --git a/drivers/peci/core.c b/drivers/peci/core.c\n" ">> > index ae7a9572cdf3..94426b7f2618 100644\n" ">> > --- a/drivers/peci/core.c\n" @@ -56,57 +83,57 @@ ">> > +peci_bus_match_device_id(const struct peci_device_id *id, struct\n" ">> > peci_device *device)\n" ">> > +{\n" - ">> > +???????while (id->family != 0) {\n" - ">> > +???????????????if (id->family == device->info.family &&\n" - ">> > +?????????????????? id->model == device->info.model)\n" - ">> > +???????????????????????return id;\n" - ">> > +???????????????id++;\n" - ">> > +???????}\n" - ">> > +\n" - ">> > +???????return NULL;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240while (id->family != 0) {\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (id->family == device->info.family &&\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 id->model == device->info.model)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return id;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240id++;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240}\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return NULL;\n" ">> > +}\n" ">> > +\n" ">> > +static int peci_bus_device_match(struct device *dev, struct device_driver\n" ">> > *drv)\n" ">> > +{\n" - ">> > +???????struct peci_device *device = to_peci_device(dev);\n" - ">> > +???????struct peci_driver *peci_drv = to_peci_driver(drv);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_device *device = to_peci_device(dev);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_driver *peci_drv = to_peci_driver(drv);\n" ">> > +\n" - ">> > +???????if (dev->type != &peci_device_type)\n" - ">> > +???????????????return 0;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (dev->type != &peci_device_type)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return 0;\n" ">> > +\n" - ">> > +???????if (peci_bus_match_device_id(peci_drv->id_table, device))\n" - ">> > +???????????????return 1;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (peci_bus_match_device_id(peci_drv->id_table, device))\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return 1;\n" ">> > +\n" - ">> > +???????return 0;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return 0;\n" ">> > +}\n" ">> > +\n" ">> > +static int peci_bus_device_probe(struct device *dev)\n" ">> > +{\n" - ">> > +???????struct peci_device *device = to_peci_device(dev);\n" - ">> > +???????struct peci_driver *driver = to_peci_driver(dev->driver);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_device *device = to_peci_device(dev);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_driver *driver = to_peci_driver(dev->driver);\n" ">> > +\n" - ">> > +???????return driver->probe(device, peci_bus_match_device_id(driver-\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return driver->probe(device, peci_bus_match_device_id(driver-\n" ">> > >id_table, device));\n" ">> > +}\n" ">> > +\n" ">> > +static int peci_bus_device_remove(struct device *dev)\n" ">> > +{\n" - ">> > +???????struct peci_device *device = to_peci_device(dev);\n" - ">> > +???????struct peci_driver *driver = to_peci_driver(dev->driver);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_device *device = to_peci_device(dev);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_driver *driver = to_peci_driver(dev->driver);\n" ">> > +\n" - ">> > +???????if (driver->remove)\n" - ">> > +???????????????driver->remove(device);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (driver->remove)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240driver->remove(device);\n" ">> > +\n" - ">> > +???????return 0;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return 0;\n" ">> > +}\n" ">> > +\n" ">> > struct bus_type peci_bus_type = {\n" - ">> > ????????.name???????????= \"peci\",\n" - ">> > +???????.match??????????= peci_bus_device_match,\n" - ">> > +???????.probe??????????= peci_bus_device_probe,\n" - ">> > +???????.remove?????????= peci_bus_device_remove,\n" - ">> > ????????.bus_groups?????= peci_bus_groups,\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240.name\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240= \"peci\",\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240.match\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240= peci_bus_device_match,\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240.probe\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240= peci_bus_device_probe,\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240.remove\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240= peci_bus_device_remove,\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240.bus_groups\302\240\302\240\302\240\302\240\302\240= peci_bus_groups,\n" ">> > };\n" ">> >\n" ">> > diff --git a/drivers/peci/device.c b/drivers/peci/device.c\n" @@ -127,19 +154,19 @@ ">> > +#define REVISION_NUM_MASK GENMASK(15, 8)\n" ">> > +static int peci_get_revision(struct peci_device *device, u8 *revision)\n" ">> > +{\n" - ">> > +???????struct peci_request *req;\n" - ">> > +???????u64 dib;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_request *req;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u64 dib;\n" ">> > +\n" - ">> > +???????req = peci_get_dib(device);\n" - ">> > +???????if (IS_ERR(req))\n" - ">> > +???????????????return PTR_ERR(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240req = peci_get_dib(device);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (IS_ERR(req))\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return PTR_ERR(req);\n" ">> > +\n" - ">> > +???????dib = peci_request_data_dib(req);\n" - ">> > +???????if (dib == 0) {\n" - ">> > +???????????????peci_request_free(req);\n" - ">> > +???????????????return -EIO;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240dib = peci_request_data_dib(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (dib == 0) {\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240peci_request_free(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return -EIO;\n" ">>\n" - ">> Any particular reason to check for zero specifically here?? It looks\n" + ">> Any particular reason to check for zero specifically here?\302\240 It looks\n" ">> like that would be a case where the host CPU responds and everything's\n" ">> otherwise fine, but the host just happened to send back a bunch of zeros\n" ">> for whatever reason -- which may not be a valid PECI revision number,\n" @@ -179,30 +206,30 @@ "written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case.\n" "\n" ">>\n" - ">> > +???????}\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240}\n" ">> > +\n" - ">> > +???????*revision = FIELD_GET(REVISION_NUM_MASK, dib);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240*revision = FIELD_GET(REVISION_NUM_MASK, dib);\n" ">> > +\n" - ">> > +???????peci_request_free(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240peci_request_free(req);\n" ">> > +\n" - ">> > +???????return 0;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return 0;\n" ">> > +}\n" ">> > +\n" ">> > +static int peci_get_cpu_id(struct peci_device *device, u32 *cpu_id)\n" ">> > +{\n" - ">> > +???????struct peci_request *req;\n" - ">> > +???????int ret;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_request *req;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240int ret;\n" ">> > +\n" - ">> > +???????req = peci_pkg_cfg_readl(device, PECI_PCS_PKG_ID,\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240req = peci_pkg_cfg_readl(device, PECI_PCS_PKG_ID,\n" ">> > PECI_PKG_ID_CPU_ID);\n" - ">> > +???????if (IS_ERR(req))\n" - ">> > +???????????????return PTR_ERR(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (IS_ERR(req))\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return PTR_ERR(req);\n" ">> > +\n" - ">> > +???????ret = peci_request_status(req);\n" - ">> > +???????if (ret)\n" - ">> > +???????????????goto out_req_free;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = peci_request_status(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240goto out_req_free;\n" ">> > +\n" - ">> > +???????*cpu_id = peci_request_data_readl(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240*cpu_id = peci_request_data_readl(req);\n" ">> > +out_req_free:\n" ">>\n" ">> As suggested on patch #8, I think it might be cleaner to stack-allocate\n" @@ -210,8 +237,8 @@ ">> calls in functions like this and hence might simplify it away entirely,\n" ">> but if this does remain like this we could just do\n" ">>\n" - ">> ????????if (!ret)\n" - ">> ????????????????*cpu_id = peci_request_data_readl(req);\n" + ">> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (!ret)\n" + ">> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240*cpu_id = peci_request_data_readl(req);\n" ">>\n" ">> instead of using a goto to skip a single line.\n" ">\n" @@ -221,87 +248,87 @@ ">case of peci requests.\n" ">\n" ">>\n" - ">> > +???????peci_request_free(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240peci_request_free(req);\n" ">> > +\n" - ">> > +???????return ret;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ret;\n" ">> > +}\n" ">> > +\n" ">> > +static int peci_device_info_init(struct peci_device *device)\n" ">> > +{\n" - ">> > +???????u8 revision;\n" - ">> > +???????u32 cpu_id;\n" - ">> > +???????int ret;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u8 revision;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u32 cpu_id;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240int ret;\n" ">> > +\n" - ">> > +???????ret = peci_get_cpu_id(device, &cpu_id);\n" - ">> > +???????if (ret)\n" - ">> > +???????????????return ret;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = peci_get_cpu_id(device, &cpu_id);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ret;\n" ">> > +\n" - ">> > +???????device->info.family = x86_family(cpu_id);\n" - ">> > +???????device->info.model = x86_model(cpu_id);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240device->info.family = x86_family(cpu_id);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240device->info.model = x86_model(cpu_id);\n" ">> > +\n" - ">> > +???????ret = peci_get_revision(device, &revision);\n" - ">> > +???????if (ret)\n" - ">> > +???????????????return ret;\n" - ">> > +???????device->info.peci_revision = revision;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = peci_get_revision(device, &revision);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ret;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240device->info.peci_revision = revision;\n" ">> > +\n" - ">> > +???????device->info.socket_id = device->addr - PECI_BASE_ADDR;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240device->info.socket_id = device->addr - PECI_BASE_ADDR;\n" ">> > +\n" - ">> > +???????return 0;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return 0;\n" ">> > +}\n" ">> > +\n" ">> > static int peci_detect(struct peci_controller *controller, u8 addr)\n" ">> > {\n" - ">> > ????????struct peci_request *req;\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_request *req;\n" ">> > @@ -75,6 +143,10 @@ int peci_device_create(struct peci_controller\n" ">> > *controller, u8 addr)\n" - ">> > ????????device->dev.bus = &peci_bus_type;\n" - ">> > ????????device->dev.type = &peci_device_type;\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240device->dev.bus = &peci_bus_type;\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240device->dev.type = &peci_device_type;\n" ">> >\n" - ">> > +???????ret = peci_device_info_init(device);\n" - ">> > +???????if (ret)\n" - ">> > +???????????????goto err_free;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = peci_device_info_init(device);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240goto err_free;\n" ">> > +\n" - ">> > ????????ret = dev_set_name(&device->dev, \"%d-%02x\", controller->id, device-\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = dev_set_name(&device->dev, \"%d-%02x\", controller->id, device-\n" ">> > >addr);\n" - ">> > ????????if (ret)\n" - ">> > ????????????????goto err_free;\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret)\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240goto err_free;\n" ">> > @@ -98,6 +170,33 @@ void peci_device_destroy(struct peci_device *device)\n" - ">> > ????????device_unregister(&device->dev);\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240device_unregister(&device->dev);\n" ">> > }\n" ">> >\n" ">> > +int __peci_driver_register(struct peci_driver *driver, struct module\n" ">> > *owner,\n" - ">> > +????????????????????????? const char *mod_name)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 const char *mod_name)\n" ">> > +{\n" - ">> > +???????driver->driver.bus = &peci_bus_type;\n" - ">> > +???????driver->driver.owner = owner;\n" - ">> > +???????driver->driver.mod_name = mod_name;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240driver->driver.bus = &peci_bus_type;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240driver->driver.owner = owner;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240driver->driver.mod_name = mod_name;\n" ">> > +\n" - ">> > +???????if (!driver->probe) {\n" - ">> > +???????????????pr_err(\"peci: trying to register driver without probe\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (!driver->probe) {\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240pr_err(\"peci: trying to register driver without probe\n" ">> > callback\\n\");\n" - ">> > +???????????????return -EINVAL;\n" - ">> > +???????}\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return -EINVAL;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240}\n" ">> > +\n" - ">> > +???????if (!driver->id_table) {\n" - ">> > +???????????????pr_err(\"peci: trying to register driver without device id\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (!driver->id_table) {\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240pr_err(\"peci: trying to register driver without device id\n" ">> > table\\n\");\n" - ">> > +???????????????return -EINVAL;\n" - ">> > +???????}\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return -EINVAL;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240}\n" ">> > +\n" - ">> > +???????return driver_register(&driver->driver);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return driver_register(&driver->driver);\n" ">> > +}\n" ">> > +EXPORT_SYMBOL_NS_GPL(__peci_driver_register, PECI);\n" ">> > +\n" ">> > +void peci_driver_unregister(struct peci_driver *driver)\n" ">> > +{\n" - ">> > +???????driver_unregister(&driver->driver);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240driver_unregister(&driver->driver);\n" ">> > +}\n" ">> > +EXPORT_SYMBOL_NS_GPL(peci_driver_unregister, PECI);\n" ">> > +\n" ">> > static void peci_device_release(struct device *dev)\n" ">> > {\n" - ">> > ????????struct peci_device *device = to_peci_device(dev);\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_device *device = to_peci_device(dev);\n" ">> > diff --git a/drivers/peci/internal.h b/drivers/peci/internal.h\n" ">> > index 6b139adaf6b8..c891c93e077a 100644\n" ">> > --- a/drivers/peci/internal.h\n" @@ -338,9 +365,9 @@ ">> > + * @model: device model\n" ">> > + */\n" ">> > +struct peci_device_id {\n" - ">> > +???????const void *data;\n" - ">> > +???????u16 family;\n" - ">> > +???????u8 model;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240const void *data;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u16 family;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u8 model;\n" ">> > +};\n" ">> > +\n" ">> > extern struct device_type peci_device_type;\n" @@ -358,21 +385,21 @@ ">> > + * @id_table: PECI device match table to decide which device to bind\n" ">> > + */\n" ">> > +struct peci_driver {\n" - ">> > +???????struct device_driver driver;\n" - ">> > +???????int (*probe)(struct peci_device *device, const struct peci_device_id\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct device_driver driver;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240int (*probe)(struct peci_device *device, const struct peci_device_id\n" ">> > *id);\n" - ">> > +???????void (*remove)(struct peci_device *device);\n" - ">> > +???????const struct peci_device_id *id_table;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240void (*remove)(struct peci_device *device);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240const struct peci_device_id *id_table;\n" ">> > +};\n" ">> > +\n" ">> > +static inline struct peci_driver *to_peci_driver(struct device_driver *d)\n" ">> > +{\n" - ">> > +???????return container_of(d, struct peci_driver, driver);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return container_of(d, struct peci_driver, driver);\n" ">> > +}\n" ">> > +\n" ">> > +int __peci_driver_register(struct peci_driver *driver, struct module\n" ">> > *owner,\n" - ">> > +????????????????????????? const char *mod_name);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 const char *mod_name);\n" ">> > +/**\n" ">> > + * peci_driver_register() - register PECI driver\n" ">> > + * @driver: the driver to be registered\n" @@ -386,7 +413,7 @@ ">> > + * Return: zero on success, else a negative error code.\n" ">> > + */\n" ">> > +#define peci_driver_register(driver) \\\n" - ">> > +???????__peci_driver_register(driver, THIS_MODULE, KBUILD_MODNAME)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240__peci_driver_register(driver, THIS_MODULE, KBUILD_MODNAME)\n" ">> > +void peci_driver_unregister(struct peci_driver *driver);\n" ">> > +\n" ">> > +/**\n" @@ -400,7 +427,7 @@ ">> > module_exit()\n" ">> > + */\n" ">> > +#define module_peci_driver(__peci_driver) \\\n" - ">> > +???????module_driver(__peci_driver, peci_driver_register,\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240module_driver(__peci_driver, peci_driver_register,\n" ">> > peci_driver_unregister)\n" ">> > +\n" ">> > extern struct device_type peci_controller_type;\n" @@ -424,39 +451,39 @@ ">> > +\n" ">> > #include \"internal.h\"\n" ">> >\n" - ">> > +#define PECI_GET_DIB_CMD???????????????0xf7\n" - ">> > +#define? PECI_GET_DIB_WR_LEN???????????1\n" - ">> > +#define? PECI_GET_DIB_RD_LEN???????????8\n" + ">> > +#define PECI_GET_DIB_CMD\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400xf7\n" + ">> > +#define\302\240 PECI_GET_DIB_WR_LEN\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2401\n" + ">> > +#define\302\240 PECI_GET_DIB_RD_LEN\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2408\n" ">> > +\n" - ">> > +#define PECI_RDPKGCFG_CMD??????????????0xa1\n" - ">> > +#define? PECI_RDPKGCFG_WRITE_LEN???????5\n" - ">> > +#define? PECI_RDPKGCFG_READ_LEN_BASE???1\n" - ">> > +#define PECI_WRPKGCFG_CMD??????????????0xa5\n" - ">> > +#define? PECI_WRPKGCFG_WRITE_LEN_BASE??6\n" - ">> > +#define? PECI_WRPKGCFG_READ_LEN????????????????1\n" + ">> > +#define PECI_RDPKGCFG_CMD\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400xa1\n" + ">> > +#define\302\240 PECI_RDPKGCFG_WRITE_LEN\302\240\302\240\302\240\302\240\302\240\302\240\302\2405\n" + ">> > +#define\302\240 PECI_RDPKGCFG_READ_LEN_BASE\302\240\302\240\302\2401\n" + ">> > +#define PECI_WRPKGCFG_CMD\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400xa5\n" + ">> > +#define\302\240 PECI_WRPKGCFG_WRITE_LEN_BASE\302\240\302\2406\n" + ">> > +#define\302\240 PECI_WRPKGCFG_READ_LEN\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2401\n" ">> > +\n" ">> > +/* Device Specific Completion Code (CC) Definition */\n" - ">> > +#define PECI_CC_SUCCESS????????????????????????????????0x40\n" - ">> > +#define PECI_CC_NEED_RETRY?????????????????????0x80\n" - ">> > +#define PECI_CC_OUT_OF_RESOURCE????????????????????????0x81\n" - ">> > +#define PECI_CC_UNAVAIL_RESOURCE???????????????0x82\n" - ">> > +#define PECI_CC_INVALID_REQ????????????????????0x90\n" - ">> > +#define PECI_CC_MCA_ERROR??????????????????????0x91\n" - ">> > +#define PECI_CC_CATASTROPHIC_MCA_ERROR?????????0x93\n" - ">> > +#define PECI_CC_FATAL_MCA_ERROR????????????????????????0x94\n" - ">> > +#define PECI_CC_PARITY_ERR_GPSB_OR_PMSB????????????????0x98\n" - ">> > +#define PECI_CC_PARITY_ERR_GPSB_OR_PMSB_IERR???0x9B\n" - ">> > +#define PECI_CC_PARITY_ERR_GPSB_OR_PMSB_MCA????0x9C\n" - ">> > +\n" - ">> > +#define PECI_RETRY_BIT?????????????????BIT(0)\n" - ">> > +\n" - ">> > +#define PECI_RETRY_TIMEOUT?????????????msecs_to_jiffies(700)\n" - ">> > +#define PECI_RETRY_INTERVAL_MIN????????????????msecs_to_jiffies(1)\n" - ">> > +#define PECI_RETRY_INTERVAL_MAX????????????????msecs_to_jiffies(128)\n" + ">> > +#define PECI_CC_SUCCESS\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400x40\n" + ">> > +#define PECI_CC_NEED_RETRY\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400x80\n" + ">> > +#define PECI_CC_OUT_OF_RESOURCE\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400x81\n" + ">> > +#define PECI_CC_UNAVAIL_RESOURCE\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400x82\n" + ">> > +#define PECI_CC_INVALID_REQ\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400x90\n" + ">> > +#define PECI_CC_MCA_ERROR\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400x91\n" + ">> > +#define PECI_CC_CATASTROPHIC_MCA_ERROR\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400x93\n" + ">> > +#define PECI_CC_FATAL_MCA_ERROR\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400x94\n" + ">> > +#define PECI_CC_PARITY_ERR_GPSB_OR_PMSB\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400x98\n" + ">> > +#define PECI_CC_PARITY_ERR_GPSB_OR_PMSB_IERR\302\240\302\240\302\2400x9B\n" + ">> > +#define PECI_CC_PARITY_ERR_GPSB_OR_PMSB_MCA\302\240\302\240\302\240\302\2400x9C\n" + ">> > +\n" + ">> > +#define PECI_RETRY_BIT\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240BIT(0)\n" + ">> > +\n" + ">> > +#define PECI_RETRY_TIMEOUT\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240msecs_to_jiffies(700)\n" + ">> > +#define PECI_RETRY_INTERVAL_MIN\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240msecs_to_jiffies(1)\n" + ">> > +#define PECI_RETRY_INTERVAL_MAX\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240msecs_to_jiffies(128)\n" ">> > +\n" ">> > +static u8 peci_request_data_cc(struct peci_request *req)\n" ">> > +{\n" - ">> > +???????return req->rx.buf[0];\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return req->rx.buf[0];\n" ">> > +}\n" ">> > +\n" ">> > +/**\n" @@ -471,175 +498,175 @@ ">> > + */\n" ">> > +int peci_request_status(struct peci_request *req)\n" ">> > +{\n" - ">> > +???????u8 cc = peci_request_data_cc(req);\n" - ">> > +\n" - ">> > +???????if (cc != PECI_CC_SUCCESS)\n" - ">> > +???????????????dev_dbg(&req->device->dev, \"ret: %#02x\\n\", cc);\n" - ">> > +\n" - ">> > +???????switch (cc) {\n" - ">> > +???????case PECI_CC_SUCCESS:\n" - ">> > +???????????????return 0;\n" - ">> > +???????case PECI_CC_NEED_RETRY:\n" - ">> > +???????case PECI_CC_OUT_OF_RESOURCE:\n" - ">> > +???????case PECI_CC_UNAVAIL_RESOURCE:\n" - ">> > +???????????????return -EAGAIN;\n" - ">> > +???????case PECI_CC_INVALID_REQ:\n" - ">> > +???????????????return -EINVAL;\n" - ">> > +???????case PECI_CC_MCA_ERROR:\n" - ">> > +???????case PECI_CC_CATASTROPHIC_MCA_ERROR:\n" - ">> > +???????case PECI_CC_FATAL_MCA_ERROR:\n" - ">> > +???????case PECI_CC_PARITY_ERR_GPSB_OR_PMSB:\n" - ">> > +???????case PECI_CC_PARITY_ERR_GPSB_OR_PMSB_IERR:\n" - ">> > +???????case PECI_CC_PARITY_ERR_GPSB_OR_PMSB_MCA:\n" - ">> > +???????????????return -EIO;\n" - ">> > +???????}\n" - ">> > +\n" - ">> > +???????WARN_ONCE(1, \"Unknown PECI completion code: %#02x\\n\", cc);\n" - ">> > +\n" - ">> > +???????return -EIO;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u8 cc = peci_request_data_cc(req);\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (cc != PECI_CC_SUCCESS)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240dev_dbg(&req->device->dev, \"ret: %#02x\\n\", cc);\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240switch (cc) {\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240case PECI_CC_SUCCESS:\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return 0;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240case PECI_CC_NEED_RETRY:\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240case PECI_CC_OUT_OF_RESOURCE:\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240case PECI_CC_UNAVAIL_RESOURCE:\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return -EAGAIN;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240case PECI_CC_INVALID_REQ:\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return -EINVAL;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240case PECI_CC_MCA_ERROR:\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240case PECI_CC_CATASTROPHIC_MCA_ERROR:\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240case PECI_CC_FATAL_MCA_ERROR:\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240case PECI_CC_PARITY_ERR_GPSB_OR_PMSB:\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240case PECI_CC_PARITY_ERR_GPSB_OR_PMSB_IERR:\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240case PECI_CC_PARITY_ERR_GPSB_OR_PMSB_MCA:\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return -EIO;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240}\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240WARN_ONCE(1, \"Unknown PECI completion code: %#02x\\n\", cc);\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return -EIO;\n" ">> > +}\n" ">> > +EXPORT_SYMBOL_NS_GPL(peci_request_status, PECI);\n" ">> > +\n" ">> > +static int peci_request_xfer(struct peci_request *req)\n" ">> > +{\n" - ">> > +???????struct peci_device *device = req->device;\n" - ">> > +???????struct peci_controller *controller = device->controller;\n" - ">> > +???????int ret;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_device *device = req->device;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_controller *controller = device->controller;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240int ret;\n" ">> > +\n" - ">> > +???????mutex_lock(&controller->bus_lock);\n" - ">> > +???????ret = controller->xfer(controller, device->addr, req);\n" - ">> > +???????mutex_unlock(&controller->bus_lock);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240mutex_lock(&controller->bus_lock);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = controller->xfer(controller, device->addr, req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240mutex_unlock(&controller->bus_lock);\n" ">> > +\n" - ">> > +???????return ret;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ret;\n" ">> > +}\n" ">> > +\n" ">> > +static int peci_request_xfer_retry(struct peci_request *req)\n" ">> > +{\n" - ">> > +???????long wait_interval = PECI_RETRY_INTERVAL_MIN;\n" - ">> > +???????struct peci_device *device = req->device;\n" - ">> > +???????struct peci_controller *controller = device->controller;\n" - ">> > +???????unsigned long start = jiffies;\n" - ">> > +???????int ret;\n" - ">> > +\n" - ">> > +???????/* Don't try to use it for ping */\n" - ">> > +???????if (WARN_ON(!req->rx.buf))\n" - ">> > +???????????????return 0;\n" - ">> > +\n" - ">> > +???????do {\n" - ">> > +???????????????ret = peci_request_xfer(req);\n" - ">> > +???????????????if (ret) {\n" - ">> > +???????????????????????dev_dbg(&controller->dev, \"xfer error: %d\\n\", ret);\n" - ">> > +???????????????????????return ret;\n" - ">> > +???????????????}\n" - ">> > +\n" - ">> > +???????????????if (peci_request_status(req) != -EAGAIN)\n" - ">> > +???????????????????????return 0;\n" - ">> > +\n" - ">> > +???????????????/* Set the retry bit to indicate a retry attempt */\n" - ">> > +???????????????req->tx.buf[1] |= PECI_RETRY_BIT;\n" - ">> > +\n" - ">> > +???????????????if (schedule_timeout_interruptible(wait_interval))\n" - ">> > +???????????????????????return -ERESTARTSYS;\n" - ">> > +\n" - ">> > +???????????????wait_interval *= 2;\n" - ">> > +???????????????if (wait_interval > PECI_RETRY_INTERVAL_MAX)\n" - ">> > +???????????????????????wait_interval = PECI_RETRY_INTERVAL_MAX;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240long wait_interval = PECI_RETRY_INTERVAL_MIN;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_device *device = req->device;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_controller *controller = device->controller;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240unsigned long start = jiffies;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240int ret;\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240/* Don't try to use it for ping */\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (WARN_ON(!req->rx.buf))\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return 0;\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240do {\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = peci_request_xfer(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret) {\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240dev_dbg(&controller->dev, \"xfer error: %d\\n\", ret);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ret;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240}\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (peci_request_status(req) != -EAGAIN)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return 0;\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240/* Set the retry bit to indicate a retry attempt */\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240req->tx.buf[1] |= PECI_RETRY_BIT;\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (schedule_timeout_interruptible(wait_interval))\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return -ERESTARTSYS;\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240wait_interval *= 2;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (wait_interval > PECI_RETRY_INTERVAL_MAX)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240wait_interval = PECI_RETRY_INTERVAL_MAX;\n" ">>\n" ">> wait_interval = min(wait_interval * 2, PECI_RETRY_INTERVAL_MAX) ?\n" ">\n" ">Ack.\n" ">\n" ">>\n" - ">> > +???????} while (time_before(jiffies, start + PECI_RETRY_TIMEOUT));\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240} while (time_before(jiffies, start + PECI_RETRY_TIMEOUT));\n" ">> > +\n" - ">> > +???????dev_dbg(&controller->dev, \"request timed out\\n\");\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240dev_dbg(&controller->dev, \"request timed out\\n\");\n" ">> > +\n" - ">> > +???????return -ETIMEDOUT;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return -ETIMEDOUT;\n" ">> > +}\n" ">> > +\n" ">> > /**\n" - ">> > ?* peci_request_alloc() - allocate &struct peci_request with buffers with\n" + ">> > \302\240* peci_request_alloc() - allocate &struct peci_request with buffers with\n" ">> > given lengths\n" - ">> > ?* @device: PECI device to which request is going to be sent\n" + ">> > \302\240* @device: PECI device to which request is going to be sent\n" ">> > @@ -72,3 +201,91 @@ void peci_request_free(struct peci_request *req)\n" - ">> > ????????kfree(req);\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240kfree(req);\n" ">> > }\n" ">> > EXPORT_SYMBOL_NS_GPL(peci_request_free, PECI);\n" ">> > +\n" ">> > +struct peci_request *peci_get_dib(struct peci_device *device)\n" ">> > +{\n" - ">> > +???????struct peci_request *req;\n" - ">> > +???????int ret;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_request *req;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240int ret;\n" ">> > +\n" - ">> > +???????req = peci_request_alloc(device, PECI_GET_DIB_WR_LEN,\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240req = peci_request_alloc(device, PECI_GET_DIB_WR_LEN,\n" ">> > PECI_GET_DIB_RD_LEN);\n" - ">> > +???????if (!req)\n" - ">> > +???????????????return ERR_PTR(-ENOMEM);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (!req)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ERR_PTR(-ENOMEM);\n" ">> > +\n" - ">> > +???????req->tx.buf[0] = PECI_GET_DIB_CMD;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240req->tx.buf[0] = PECI_GET_DIB_CMD;\n" ">> > +\n" - ">> > +???????ret = peci_request_xfer(req);\n" - ">> > +???????if (ret) {\n" - ">> > +???????????????peci_request_free(req);\n" - ">> > +???????????????return ERR_PTR(ret);\n" - ">> > +???????}\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = peci_request_xfer(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret) {\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240peci_request_free(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ERR_PTR(ret);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240}\n" ">> > +\n" - ">> > +???????return req;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return req;\n" ">> > +}\n" ">> > +EXPORT_SYMBOL_NS_GPL(peci_get_dib, PECI);\n" ">> > +\n" ">> > +static struct peci_request *\n" ">> > +__pkg_cfg_read(struct peci_device *device, u8 index, u16 param, u8 len)\n" ">> > +{\n" - ">> > +???????struct peci_request *req;\n" - ">> > +???????int ret;\n" - ">> > +\n" - ">> > +???????req = peci_request_alloc(device, PECI_RDPKGCFG_WRITE_LEN,\n" - ">> > +??????????????????????????????? PECI_RDPKGCFG_READ_LEN_BASE + len);\n" - ">> > +???????if (!req)\n" - ">> > +???????????????return ERR_PTR(-ENOMEM);\n" - ">> > +\n" - ">> > +???????req->tx.buf[0] = PECI_RDPKGCFG_CMD;\n" - ">> > +???????req->tx.buf[1] = 0;\n" - ">> > +???????req->tx.buf[2] = index;\n" - ">> > +???????put_unaligned_le16(param, &req->tx.buf[3]);\n" - ">> > +\n" - ">> > +???????ret = peci_request_xfer_retry(req);\n" - ">> > +???????if (ret) {\n" - ">> > +???????????????peci_request_free(req);\n" - ">> > +???????????????return ERR_PTR(ret);\n" - ">> > +???????}\n" - ">> > +\n" - ">> > +???????return req;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_request *req;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240int ret;\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240req = peci_request_alloc(device, PECI_RDPKGCFG_WRITE_LEN,\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 PECI_RDPKGCFG_READ_LEN_BASE + len);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (!req)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ERR_PTR(-ENOMEM);\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240req->tx.buf[0] = PECI_RDPKGCFG_CMD;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240req->tx.buf[1] = 0;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240req->tx.buf[2] = index;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240put_unaligned_le16(param, &req->tx.buf[3]);\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = peci_request_xfer_retry(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret) {\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240peci_request_free(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ERR_PTR(ret);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240}\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return req;\n" ">> > +}\n" ">> > +\n" ">> > +u8 peci_request_data_readb(struct peci_request *req)\n" ">> > +{\n" - ">> > +???????return req->rx.buf[1];\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return req->rx.buf[1];\n" ">> > +}\n" ">> > +EXPORT_SYMBOL_NS_GPL(peci_request_data_readb, PECI);\n" ">> > +\n" ">> > +u16 peci_request_data_readw(struct peci_request *req)\n" ">> > +{\n" - ">> > +???????return get_unaligned_le16(&req->rx.buf[1]);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return get_unaligned_le16(&req->rx.buf[1]);\n" ">> > +}\n" ">> > +EXPORT_SYMBOL_NS_GPL(peci_request_data_readw, PECI);\n" ">> > +\n" ">> > +u32 peci_request_data_readl(struct peci_request *req)\n" ">> > +{\n" - ">> > +???????return get_unaligned_le32(&req->rx.buf[1]);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return get_unaligned_le32(&req->rx.buf[1]);\n" ">> > +}\n" ">> > +EXPORT_SYMBOL_NS_GPL(peci_request_data_readl, PECI);\n" ">> > +\n" ">> > +u64 peci_request_data_readq(struct peci_request *req)\n" ">> > +{\n" - ">> > +???????return get_unaligned_le64(&req->rx.buf[1]);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return get_unaligned_le64(&req->rx.buf[1]);\n" ">> > +}\n" ">> > +EXPORT_SYMBOL_NS_GPL(peci_request_data_readq, PECI);\n" ">> > +\n" ">> > +u64 peci_request_data_dib(struct peci_request *req)\n" ">> > +{\n" - ">> > +???????return get_unaligned_le64(&req->rx.buf[0]);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return get_unaligned_le64(&req->rx.buf[0]);\n" ">> > +}\n" ">> > +EXPORT_SYMBOL_NS_GPL(peci_request_data_dib, PECI);\n" ">> > +\n" @@ -647,10 +674,10 @@ ">> > +struct peci_request *peci_pkg_cfg_##x(struct peci_device *device, u8 index,\n" ">> > u16 param) \\\n" ">> > +{ \\\n" - ">> > +???????return __pkg_cfg_read(device, index, param, sizeof(type)); \\\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return __pkg_cfg_read(device, index, param, sizeof(type)); \\\n" ">> > +} \\\n" ">>\n" - ">> Is there a reason for this particular API?? I'd think a more natural one\n" + ">> Is there a reason for this particular API?\302\240 I'd think a more natural one\n" ">> that would offload a bit of boilerplate from callers would look more like\n" ">>\n" ">> int peci_pkg_cfg_##x(struct peci_device *device, u8 index, u16 param, type\n" @@ -682,42 +709,42 @@ ">> > #include <linux/mutex.h>\n" ">> > #include <linux/types.h>\n" ">> >\n" - ">> > +#define PECI_PCS_PKG_ID????????????????????????0? /* Package Identifier\n" + ">> > +#define PECI_PCS_PKG_ID\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400\302\240 /* Package Identifier\n" ">> > Read */\n" - ">> > +#define? PECI_PKG_ID_CPU_ID????????????0x0000? /* CPUID Info */\n" - ">> > +#define? PECI_PKG_ID_PLATFORM_ID???????0x0001? /* Platform ID */\n" - ">> > +#define? PECI_PKG_ID_DEVICE_ID?????????0x0002? /* Uncore Device ID */\n" - ">> > +#define? PECI_PKG_ID_MAX_THREAD_ID?????0x0003? /* Max Thread ID */\n" - ">> > +#define? PECI_PKG_ID_MICROCODE_REV?????0x0004? /* CPU Microcode Update\n" + ">> > +#define\302\240 PECI_PKG_ID_CPU_ID\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400x0000\302\240 /* CPUID Info */\n" + ">> > +#define\302\240 PECI_PKG_ID_PLATFORM_ID\302\240\302\240\302\240\302\240\302\240\302\240\302\2400x0001\302\240 /* Platform ID */\n" + ">> > +#define\302\240 PECI_PKG_ID_DEVICE_ID\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400x0002\302\240 /* Uncore Device ID */\n" + ">> > +#define\302\240 PECI_PKG_ID_MAX_THREAD_ID\302\240\302\240\302\240\302\240\302\2400x0003\302\240 /* Max Thread ID */\n" + ">> > +#define\302\240 PECI_PKG_ID_MICROCODE_REV\302\240\302\240\302\240\302\240\302\2400x0004\302\240 /* CPU Microcode Update\n" ">> > Revision */\n" - ">> > +#define? PECI_PKG_ID_MCA_ERROR_LOG?????0x0005? /* Machine Check Status */\n" + ">> > +#define\302\240 PECI_PKG_ID_MCA_ERROR_LOG\302\240\302\240\302\240\302\240\302\2400x0005\302\240 /* Machine Check Status */\n" ">> > +\n" ">> > struct peci_request;\n" ">> >\n" ">> > /**\n" ">> > @@ -41,6 +49,11 @@ static inline struct peci_controller\n" ">> > *to_peci_controller(void *d)\n" - ">> > ?* struct peci_device - PECI device\n" - ">> > ?* @dev: device object to register PECI device to the device model\n" - ">> > ?* @controller: manages the bus segment hosting this PECI device\n" + ">> > \302\240* struct peci_device - PECI device\n" + ">> > \302\240* @dev: device object to register PECI device to the device model\n" + ">> > \302\240* @controller: manages the bus segment hosting this PECI device\n" ">> > + * @info: PECI device characteristics\n" ">> > + * @info.family: device family\n" ">> > + * @info.model: device model\n" ">> > + * @info.peci_revision: PECI revision supported by the PECI device\n" ">> > + * @info.socket_id: the socket ID represented by the PECI device\n" - ">> > ?* @addr: address used on the PECI bus connected to the parent controller\n" - ">> > ?*\n" - ">> > ?* A peci_device identifies a single device (i.e. CPU) connected to a PECI\n" + ">> > \302\240* @addr: address used on the PECI bus connected to the parent controller\n" + ">> > \302\240*\n" + ">> > \302\240* A peci_device identifies a single device (i.e. CPU) connected to a PECI\n" ">> > bus.\n" ">> > @@ -50,6 +63,12 @@ static inline struct peci_controller\n" ">> > *to_peci_controller(void *d)\n" ">> > struct peci_device {\n" - ">> > ????????struct device dev;\n" - ">> > ????????struct peci_controller *controller;\n" - ">> > +???????struct {\n" - ">> > +???????????????u16 family;\n" - ">> > +???????????????u8 model;\n" - ">> > +???????????????u8 peci_revision;\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct device dev;\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_controller *controller;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct {\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240u16 family;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240u8 model;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240u8 peci_revision;\n" ">>\n" ">> This field gets set but doesn't seem to end up used anywhere; is it\n" ">> useful?\n" @@ -732,9 +759,9 @@ ">-Iwona\n" ">\n" ">>\n" - ">> > +???????????????u8 socket_id;\n" - ">> > +???????} info;\n" - ">> > ????????u8 addr;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240u8 socket_id;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240} info;\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240u8 addr;\n" ">> > };\n" ">> >\n" ">> > diff --git a/lib/Kconfig b/lib/Kconfig\n" @@ -744,12 +771,12 @@ ">> > @@ -721,5 +721,5 @@ config ASN1_ENCODER\n" ">> >\n" ">> > config GENERIC_LIB_X86\n" - ">> > ????????bool\n" - ">> > -???????depends on X86\n" - ">> > +???????depends on X86 || PECI\n" - ">> > ????????default n\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240bool\n" + ">> > -\302\240\302\240\302\240\302\240\302\240\302\240\302\240depends on X86\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240depends on X86 || PECI\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240default n\n" ">> > --\n" ">> > 2.31.1\n" > -59cebbc101d3bc33ab3be319d67420d863e647d7adc3ae35d9c3e03b17c38743 +c6a46abe805af26bebab2f6cb862732ff0a3f0c55d3a1bb6047a96bc74e5258d
diff --git a/a/1.txt b/N2/1.txt index bd6a626..e19b964 100644 --- a/a/1.txt +++ b/N2/1.txt @@ -12,13 +12,13 @@ On Thu, Jul 29, 2021 at 04:17:06PM CDT, Winiarska, Iwona wrote: >> > Signed-off-by: Iwona Winiarska <iwona.winiarska@intel.com> >> > Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> >> > --- ->> > drivers/peci/Kconfig??? |?? 1 + ->> > drivers/peci/core.c???? |? 49 +++++++++ ->> > drivers/peci/device.c?? |? 99 ++++++++++++++++++ ->> > drivers/peci/internal.h |? 75 ++++++++++++++ ->> > drivers/peci/request.c? | 217 ++++++++++++++++++++++++++++++++++++++++ ->> > include/linux/peci.h??? |? 19 ++++ ->> > lib/Kconfig???????????? |?? 2 +- +>> > drivers/peci/Kconfig | 1 + +>> > drivers/peci/core.c | 49 +++++++++ +>> > drivers/peci/device.c | 99 ++++++++++++++++++ +>> > drivers/peci/internal.h | 75 ++++++++++++++ +>> > drivers/peci/request.c | 217 ++++++++++++++++++++++++++++++++++++++++ +>> > include/linux/peci.h | 19 ++++ +>> > lib/Kconfig | 2 +- >> > 7 files changed, 461 insertions(+), 1 deletion(-) >> > >> > diff --git a/drivers/peci/Kconfig b/drivers/peci/Kconfig @@ -28,11 +28,11 @@ On Thu, Jul 29, 2021 at 04:17:06PM CDT, Winiarska, Iwona wrote: >> > @@ -2,6 +2,7 @@ >> > >> > menuconfig PECI ->> > ????????tristate "PECI support" ->> > +???????select GENERIC_LIB_X86 ->> > ????????help ->> > ????????? The Platform Environment Control Interface (PECI) is an interface ->> > ????????? that provides a communication channel to Intel processors and +>> > tristate "PECI support" +>> > + select GENERIC_LIB_X86 +>> > help +>> > The Platform Environment Control Interface (PECI) is an interface +>> > that provides a communication channel to Intel processors and >> > diff --git a/drivers/peci/core.c b/drivers/peci/core.c >> > index ae7a9572cdf3..94426b7f2618 100644 >> > --- a/drivers/peci/core.c @@ -46,57 +46,57 @@ On Thu, Jul 29, 2021 at 04:17:06PM CDT, Winiarska, Iwona wrote: >> > +peci_bus_match_device_id(const struct peci_device_id *id, struct >> > peci_device *device) >> > +{ ->> > +???????while (id->family != 0) { ->> > +???????????????if (id->family == device->info.family && ->> > +?????????????????? id->model == device->info.model) ->> > +???????????????????????return id; ->> > +???????????????id++; ->> > +???????} ->> > + ->> > +???????return NULL; +>> > + while (id->family != 0) { +>> > + if (id->family == device->info.family && +>> > + id->model == device->info.model) +>> > + return id; +>> > + id++; +>> > + } +>> > + +>> > + return NULL; >> > +} >> > + >> > +static int peci_bus_device_match(struct device *dev, struct device_driver >> > *drv) >> > +{ ->> > +???????struct peci_device *device = to_peci_device(dev); ->> > +???????struct peci_driver *peci_drv = to_peci_driver(drv); +>> > + struct peci_device *device = to_peci_device(dev); +>> > + struct peci_driver *peci_drv = to_peci_driver(drv); >> > + ->> > +???????if (dev->type != &peci_device_type) ->> > +???????????????return 0; +>> > + if (dev->type != &peci_device_type) +>> > + return 0; >> > + ->> > +???????if (peci_bus_match_device_id(peci_drv->id_table, device)) ->> > +???????????????return 1; +>> > + if (peci_bus_match_device_id(peci_drv->id_table, device)) +>> > + return 1; >> > + ->> > +???????return 0; +>> > + return 0; >> > +} >> > + >> > +static int peci_bus_device_probe(struct device *dev) >> > +{ ->> > +???????struct peci_device *device = to_peci_device(dev); ->> > +???????struct peci_driver *driver = to_peci_driver(dev->driver); +>> > + struct peci_device *device = to_peci_device(dev); +>> > + struct peci_driver *driver = to_peci_driver(dev->driver); >> > + ->> > +???????return driver->probe(device, peci_bus_match_device_id(driver- +>> > + return driver->probe(device, peci_bus_match_device_id(driver- >> > >id_table, device)); >> > +} >> > + >> > +static int peci_bus_device_remove(struct device *dev) >> > +{ ->> > +???????struct peci_device *device = to_peci_device(dev); ->> > +???????struct peci_driver *driver = to_peci_driver(dev->driver); +>> > + struct peci_device *device = to_peci_device(dev); +>> > + struct peci_driver *driver = to_peci_driver(dev->driver); >> > + ->> > +???????if (driver->remove) ->> > +???????????????driver->remove(device); +>> > + if (driver->remove) +>> > + driver->remove(device); >> > + ->> > +???????return 0; +>> > + return 0; >> > +} >> > + >> > struct bus_type peci_bus_type = { ->> > ????????.name???????????= "peci", ->> > +???????.match??????????= peci_bus_device_match, ->> > +???????.probe??????????= peci_bus_device_probe, ->> > +???????.remove?????????= peci_bus_device_remove, ->> > ????????.bus_groups?????= peci_bus_groups, +>> > .name = "peci", +>> > + .match = peci_bus_device_match, +>> > + .probe = peci_bus_device_probe, +>> > + .remove = peci_bus_device_remove, +>> > .bus_groups = peci_bus_groups, >> > }; >> > >> > diff --git a/drivers/peci/device.c b/drivers/peci/device.c @@ -117,19 +117,19 @@ On Thu, Jul 29, 2021 at 04:17:06PM CDT, Winiarska, Iwona wrote: >> > +#define REVISION_NUM_MASK GENMASK(15, 8) >> > +static int peci_get_revision(struct peci_device *device, u8 *revision) >> > +{ ->> > +???????struct peci_request *req; ->> > +???????u64 dib; +>> > + struct peci_request *req; +>> > + u64 dib; >> > + ->> > +???????req = peci_get_dib(device); ->> > +???????if (IS_ERR(req)) ->> > +???????????????return PTR_ERR(req); +>> > + req = peci_get_dib(device); +>> > + if (IS_ERR(req)) +>> > + return PTR_ERR(req); >> > + ->> > +???????dib = peci_request_data_dib(req); ->> > +???????if (dib == 0) { ->> > +???????????????peci_request_free(req); ->> > +???????????????return -EIO; +>> > + dib = peci_request_data_dib(req); +>> > + if (dib == 0) { +>> > + peci_request_free(req); +>> > + return -EIO; >> ->> Any particular reason to check for zero specifically here?? It looks +>> Any particular reason to check for zero specifically here? It looks >> like that would be a case where the host CPU responds and everything's >> otherwise fine, but the host just happened to send back a bunch of zeros >> for whatever reason -- which may not be a valid PECI revision number, @@ -169,30 +169,30 @@ I suppose it facilitates an easy zero check, but that could also be written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >> ->> > +???????} +>> > + } >> > + ->> > +???????*revision = FIELD_GET(REVISION_NUM_MASK, dib); +>> > + *revision = FIELD_GET(REVISION_NUM_MASK, dib); >> > + ->> > +???????peci_request_free(req); +>> > + peci_request_free(req); >> > + ->> > +???????return 0; +>> > + return 0; >> > +} >> > + >> > +static int peci_get_cpu_id(struct peci_device *device, u32 *cpu_id) >> > +{ ->> > +???????struct peci_request *req; ->> > +???????int ret; +>> > + struct peci_request *req; +>> > + int ret; >> > + ->> > +???????req = peci_pkg_cfg_readl(device, PECI_PCS_PKG_ID, +>> > + req = peci_pkg_cfg_readl(device, PECI_PCS_PKG_ID, >> > PECI_PKG_ID_CPU_ID); ->> > +???????if (IS_ERR(req)) ->> > +???????????????return PTR_ERR(req); +>> > + if (IS_ERR(req)) +>> > + return PTR_ERR(req); >> > + ->> > +???????ret = peci_request_status(req); ->> > +???????if (ret) ->> > +???????????????goto out_req_free; +>> > + ret = peci_request_status(req); +>> > + if (ret) +>> > + goto out_req_free; >> > + ->> > +???????*cpu_id = peci_request_data_readl(req); +>> > + *cpu_id = peci_request_data_readl(req); >> > +out_req_free: >> >> As suggested on patch #8, I think it might be cleaner to stack-allocate @@ -200,8 +200,8 @@ written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >> calls in functions like this and hence might simplify it away entirely, >> but if this does remain like this we could just do >> ->> ????????if (!ret) ->> ????????????????*cpu_id = peci_request_data_readl(req); +>> if (!ret) +>> *cpu_id = peci_request_data_readl(req); >> >> instead of using a goto to skip a single line. > @@ -211,87 +211,87 @@ written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >case of peci requests. > >> ->> > +???????peci_request_free(req); +>> > + peci_request_free(req); >> > + ->> > +???????return ret; +>> > + return ret; >> > +} >> > + >> > +static int peci_device_info_init(struct peci_device *device) >> > +{ ->> > +???????u8 revision; ->> > +???????u32 cpu_id; ->> > +???????int ret; +>> > + u8 revision; +>> > + u32 cpu_id; +>> > + int ret; >> > + ->> > +???????ret = peci_get_cpu_id(device, &cpu_id); ->> > +???????if (ret) ->> > +???????????????return ret; +>> > + ret = peci_get_cpu_id(device, &cpu_id); +>> > + if (ret) +>> > + return ret; >> > + ->> > +???????device->info.family = x86_family(cpu_id); ->> > +???????device->info.model = x86_model(cpu_id); +>> > + device->info.family = x86_family(cpu_id); +>> > + device->info.model = x86_model(cpu_id); >> > + ->> > +???????ret = peci_get_revision(device, &revision); ->> > +???????if (ret) ->> > +???????????????return ret; ->> > +???????device->info.peci_revision = revision; +>> > + ret = peci_get_revision(device, &revision); +>> > + if (ret) +>> > + return ret; +>> > + device->info.peci_revision = revision; >> > + ->> > +???????device->info.socket_id = device->addr - PECI_BASE_ADDR; +>> > + device->info.socket_id = device->addr - PECI_BASE_ADDR; >> > + ->> > +???????return 0; +>> > + return 0; >> > +} >> > + >> > static int peci_detect(struct peci_controller *controller, u8 addr) >> > { ->> > ????????struct peci_request *req; +>> > struct peci_request *req; >> > @@ -75,6 +143,10 @@ int peci_device_create(struct peci_controller >> > *controller, u8 addr) ->> > ????????device->dev.bus = &peci_bus_type; ->> > ????????device->dev.type = &peci_device_type; +>> > device->dev.bus = &peci_bus_type; +>> > device->dev.type = &peci_device_type; >> > ->> > +???????ret = peci_device_info_init(device); ->> > +???????if (ret) ->> > +???????????????goto err_free; +>> > + ret = peci_device_info_init(device); +>> > + if (ret) +>> > + goto err_free; >> > + ->> > ????????ret = dev_set_name(&device->dev, "%d-%02x", controller->id, device- +>> > ret = dev_set_name(&device->dev, "%d-%02x", controller->id, device- >> > >addr); ->> > ????????if (ret) ->> > ????????????????goto err_free; +>> > if (ret) +>> > goto err_free; >> > @@ -98,6 +170,33 @@ void peci_device_destroy(struct peci_device *device) ->> > ????????device_unregister(&device->dev); +>> > device_unregister(&device->dev); >> > } >> > >> > +int __peci_driver_register(struct peci_driver *driver, struct module >> > *owner, ->> > +????????????????????????? const char *mod_name) +>> > + const char *mod_name) >> > +{ ->> > +???????driver->driver.bus = &peci_bus_type; ->> > +???????driver->driver.owner = owner; ->> > +???????driver->driver.mod_name = mod_name; +>> > + driver->driver.bus = &peci_bus_type; +>> > + driver->driver.owner = owner; +>> > + driver->driver.mod_name = mod_name; >> > + ->> > +???????if (!driver->probe) { ->> > +???????????????pr_err("peci: trying to register driver without probe +>> > + if (!driver->probe) { +>> > + pr_err("peci: trying to register driver without probe >> > callback\n"); ->> > +???????????????return -EINVAL; ->> > +???????} +>> > + return -EINVAL; +>> > + } >> > + ->> > +???????if (!driver->id_table) { ->> > +???????????????pr_err("peci: trying to register driver without device id +>> > + if (!driver->id_table) { +>> > + pr_err("peci: trying to register driver without device id >> > table\n"); ->> > +???????????????return -EINVAL; ->> > +???????} +>> > + return -EINVAL; +>> > + } >> > + ->> > +???????return driver_register(&driver->driver); +>> > + return driver_register(&driver->driver); >> > +} >> > +EXPORT_SYMBOL_NS_GPL(__peci_driver_register, PECI); >> > + >> > +void peci_driver_unregister(struct peci_driver *driver) >> > +{ ->> > +???????driver_unregister(&driver->driver); +>> > + driver_unregister(&driver->driver); >> > +} >> > +EXPORT_SYMBOL_NS_GPL(peci_driver_unregister, PECI); >> > + >> > static void peci_device_release(struct device *dev) >> > { ->> > ????????struct peci_device *device = to_peci_device(dev); +>> > struct peci_device *device = to_peci_device(dev); >> > diff --git a/drivers/peci/internal.h b/drivers/peci/internal.h >> > index 6b139adaf6b8..c891c93e077a 100644 >> > --- a/drivers/peci/internal.h @@ -328,9 +328,9 @@ written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >> > + * @model: device model >> > + */ >> > +struct peci_device_id { ->> > +???????const void *data; ->> > +???????u16 family; ->> > +???????u8 model; +>> > + const void *data; +>> > + u16 family; +>> > + u8 model; >> > +}; >> > + >> > extern struct device_type peci_device_type; @@ -348,21 +348,21 @@ written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >> > + * @id_table: PECI device match table to decide which device to bind >> > + */ >> > +struct peci_driver { ->> > +???????struct device_driver driver; ->> > +???????int (*probe)(struct peci_device *device, const struct peci_device_id +>> > + struct device_driver driver; +>> > + int (*probe)(struct peci_device *device, const struct peci_device_id >> > *id); ->> > +???????void (*remove)(struct peci_device *device); ->> > +???????const struct peci_device_id *id_table; +>> > + void (*remove)(struct peci_device *device); +>> > + const struct peci_device_id *id_table; >> > +}; >> > + >> > +static inline struct peci_driver *to_peci_driver(struct device_driver *d) >> > +{ ->> > +???????return container_of(d, struct peci_driver, driver); +>> > + return container_of(d, struct peci_driver, driver); >> > +} >> > + >> > +int __peci_driver_register(struct peci_driver *driver, struct module >> > *owner, ->> > +????????????????????????? const char *mod_name); +>> > + const char *mod_name); >> > +/** >> > + * peci_driver_register() - register PECI driver >> > + * @driver: the driver to be registered @@ -376,7 +376,7 @@ written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >> > + * Return: zero on success, else a negative error code. >> > + */ >> > +#define peci_driver_register(driver) \ ->> > +???????__peci_driver_register(driver, THIS_MODULE, KBUILD_MODNAME) +>> > + __peci_driver_register(driver, THIS_MODULE, KBUILD_MODNAME) >> > +void peci_driver_unregister(struct peci_driver *driver); >> > + >> > +/** @@ -390,7 +390,7 @@ written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >> > module_exit() >> > + */ >> > +#define module_peci_driver(__peci_driver) \ ->> > +???????module_driver(__peci_driver, peci_driver_register, +>> > + module_driver(__peci_driver, peci_driver_register, >> > peci_driver_unregister) >> > + >> > extern struct device_type peci_controller_type; @@ -414,39 +414,39 @@ written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >> > + >> > #include "internal.h" >> > ->> > +#define PECI_GET_DIB_CMD???????????????0xf7 ->> > +#define? PECI_GET_DIB_WR_LEN???????????1 ->> > +#define? PECI_GET_DIB_RD_LEN???????????8 +>> > +#define PECI_GET_DIB_CMD 0xf7 +>> > +#define PECI_GET_DIB_WR_LEN 1 +>> > +#define PECI_GET_DIB_RD_LEN 8 >> > + ->> > +#define PECI_RDPKGCFG_CMD??????????????0xa1 ->> > +#define? PECI_RDPKGCFG_WRITE_LEN???????5 ->> > +#define? PECI_RDPKGCFG_READ_LEN_BASE???1 ->> > +#define PECI_WRPKGCFG_CMD??????????????0xa5 ->> > +#define? PECI_WRPKGCFG_WRITE_LEN_BASE??6 ->> > +#define? PECI_WRPKGCFG_READ_LEN????????????????1 +>> > +#define PECI_RDPKGCFG_CMD 0xa1 +>> > +#define PECI_RDPKGCFG_WRITE_LEN 5 +>> > +#define PECI_RDPKGCFG_READ_LEN_BASE 1 +>> > +#define PECI_WRPKGCFG_CMD 0xa5 +>> > +#define PECI_WRPKGCFG_WRITE_LEN_BASE 6 +>> > +#define PECI_WRPKGCFG_READ_LEN 1 >> > + >> > +/* Device Specific Completion Code (CC) Definition */ ->> > +#define PECI_CC_SUCCESS????????????????????????????????0x40 ->> > +#define PECI_CC_NEED_RETRY?????????????????????0x80 ->> > +#define PECI_CC_OUT_OF_RESOURCE????????????????????????0x81 ->> > +#define PECI_CC_UNAVAIL_RESOURCE???????????????0x82 ->> > +#define PECI_CC_INVALID_REQ????????????????????0x90 ->> > +#define PECI_CC_MCA_ERROR??????????????????????0x91 ->> > +#define PECI_CC_CATASTROPHIC_MCA_ERROR?????????0x93 ->> > +#define PECI_CC_FATAL_MCA_ERROR????????????????????????0x94 ->> > +#define PECI_CC_PARITY_ERR_GPSB_OR_PMSB????????????????0x98 ->> > +#define PECI_CC_PARITY_ERR_GPSB_OR_PMSB_IERR???0x9B ->> > +#define PECI_CC_PARITY_ERR_GPSB_OR_PMSB_MCA????0x9C ->> > + ->> > +#define PECI_RETRY_BIT?????????????????BIT(0) ->> > + ->> > +#define PECI_RETRY_TIMEOUT?????????????msecs_to_jiffies(700) ->> > +#define PECI_RETRY_INTERVAL_MIN????????????????msecs_to_jiffies(1) ->> > +#define PECI_RETRY_INTERVAL_MAX????????????????msecs_to_jiffies(128) +>> > +#define PECI_CC_SUCCESS 0x40 +>> > +#define PECI_CC_NEED_RETRY 0x80 +>> > +#define PECI_CC_OUT_OF_RESOURCE 0x81 +>> > +#define PECI_CC_UNAVAIL_RESOURCE 0x82 +>> > +#define PECI_CC_INVALID_REQ 0x90 +>> > +#define PECI_CC_MCA_ERROR 0x91 +>> > +#define PECI_CC_CATASTROPHIC_MCA_ERROR 0x93 +>> > +#define PECI_CC_FATAL_MCA_ERROR 0x94 +>> > +#define PECI_CC_PARITY_ERR_GPSB_OR_PMSB 0x98 +>> > +#define PECI_CC_PARITY_ERR_GPSB_OR_PMSB_IERR 0x9B +>> > +#define PECI_CC_PARITY_ERR_GPSB_OR_PMSB_MCA 0x9C +>> > + +>> > +#define PECI_RETRY_BIT BIT(0) +>> > + +>> > +#define PECI_RETRY_TIMEOUT msecs_to_jiffies(700) +>> > +#define PECI_RETRY_INTERVAL_MIN msecs_to_jiffies(1) +>> > +#define PECI_RETRY_INTERVAL_MAX msecs_to_jiffies(128) >> > + >> > +static u8 peci_request_data_cc(struct peci_request *req) >> > +{ ->> > +???????return req->rx.buf[0]; +>> > + return req->rx.buf[0]; >> > +} >> > + >> > +/** @@ -461,175 +461,175 @@ written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >> > + */ >> > +int peci_request_status(struct peci_request *req) >> > +{ ->> > +???????u8 cc = peci_request_data_cc(req); ->> > + ->> > +???????if (cc != PECI_CC_SUCCESS) ->> > +???????????????dev_dbg(&req->device->dev, "ret: %#02x\n", cc); ->> > + ->> > +???????switch (cc) { ->> > +???????case PECI_CC_SUCCESS: ->> > +???????????????return 0; ->> > +???????case PECI_CC_NEED_RETRY: ->> > +???????case PECI_CC_OUT_OF_RESOURCE: ->> > +???????case PECI_CC_UNAVAIL_RESOURCE: ->> > +???????????????return -EAGAIN; ->> > +???????case PECI_CC_INVALID_REQ: ->> > +???????????????return -EINVAL; ->> > +???????case PECI_CC_MCA_ERROR: ->> > +???????case PECI_CC_CATASTROPHIC_MCA_ERROR: ->> > +???????case PECI_CC_FATAL_MCA_ERROR: ->> > +???????case PECI_CC_PARITY_ERR_GPSB_OR_PMSB: ->> > +???????case PECI_CC_PARITY_ERR_GPSB_OR_PMSB_IERR: ->> > +???????case PECI_CC_PARITY_ERR_GPSB_OR_PMSB_MCA: ->> > +???????????????return -EIO; ->> > +???????} ->> > + ->> > +???????WARN_ONCE(1, "Unknown PECI completion code: %#02x\n", cc); ->> > + ->> > +???????return -EIO; +>> > + u8 cc = peci_request_data_cc(req); +>> > + +>> > + if (cc != PECI_CC_SUCCESS) +>> > + dev_dbg(&req->device->dev, "ret: %#02x\n", cc); +>> > + +>> > + switch (cc) { +>> > + case PECI_CC_SUCCESS: +>> > + return 0; +>> > + case PECI_CC_NEED_RETRY: +>> > + case PECI_CC_OUT_OF_RESOURCE: +>> > + case PECI_CC_UNAVAIL_RESOURCE: +>> > + return -EAGAIN; +>> > + case PECI_CC_INVALID_REQ: +>> > + return -EINVAL; +>> > + case PECI_CC_MCA_ERROR: +>> > + case PECI_CC_CATASTROPHIC_MCA_ERROR: +>> > + case PECI_CC_FATAL_MCA_ERROR: +>> > + case PECI_CC_PARITY_ERR_GPSB_OR_PMSB: +>> > + case PECI_CC_PARITY_ERR_GPSB_OR_PMSB_IERR: +>> > + case PECI_CC_PARITY_ERR_GPSB_OR_PMSB_MCA: +>> > + return -EIO; +>> > + } +>> > + +>> > + WARN_ONCE(1, "Unknown PECI completion code: %#02x\n", cc); +>> > + +>> > + return -EIO; >> > +} >> > +EXPORT_SYMBOL_NS_GPL(peci_request_status, PECI); >> > + >> > +static int peci_request_xfer(struct peci_request *req) >> > +{ ->> > +???????struct peci_device *device = req->device; ->> > +???????struct peci_controller *controller = device->controller; ->> > +???????int ret; +>> > + struct peci_device *device = req->device; +>> > + struct peci_controller *controller = device->controller; +>> > + int ret; >> > + ->> > +???????mutex_lock(&controller->bus_lock); ->> > +???????ret = controller->xfer(controller, device->addr, req); ->> > +???????mutex_unlock(&controller->bus_lock); +>> > + mutex_lock(&controller->bus_lock); +>> > + ret = controller->xfer(controller, device->addr, req); +>> > + mutex_unlock(&controller->bus_lock); >> > + ->> > +???????return ret; +>> > + return ret; >> > +} >> > + >> > +static int peci_request_xfer_retry(struct peci_request *req) >> > +{ ->> > +???????long wait_interval = PECI_RETRY_INTERVAL_MIN; ->> > +???????struct peci_device *device = req->device; ->> > +???????struct peci_controller *controller = device->controller; ->> > +???????unsigned long start = jiffies; ->> > +???????int ret; ->> > + ->> > +???????/* Don't try to use it for ping */ ->> > +???????if (WARN_ON(!req->rx.buf)) ->> > +???????????????return 0; ->> > + ->> > +???????do { ->> > +???????????????ret = peci_request_xfer(req); ->> > +???????????????if (ret) { ->> > +???????????????????????dev_dbg(&controller->dev, "xfer error: %d\n", ret); ->> > +???????????????????????return ret; ->> > +???????????????} ->> > + ->> > +???????????????if (peci_request_status(req) != -EAGAIN) ->> > +???????????????????????return 0; ->> > + ->> > +???????????????/* Set the retry bit to indicate a retry attempt */ ->> > +???????????????req->tx.buf[1] |= PECI_RETRY_BIT; ->> > + ->> > +???????????????if (schedule_timeout_interruptible(wait_interval)) ->> > +???????????????????????return -ERESTARTSYS; ->> > + ->> > +???????????????wait_interval *= 2; ->> > +???????????????if (wait_interval > PECI_RETRY_INTERVAL_MAX) ->> > +???????????????????????wait_interval = PECI_RETRY_INTERVAL_MAX; +>> > + long wait_interval = PECI_RETRY_INTERVAL_MIN; +>> > + struct peci_device *device = req->device; +>> > + struct peci_controller *controller = device->controller; +>> > + unsigned long start = jiffies; +>> > + int ret; +>> > + +>> > + /* Don't try to use it for ping */ +>> > + if (WARN_ON(!req->rx.buf)) +>> > + return 0; +>> > + +>> > + do { +>> > + ret = peci_request_xfer(req); +>> > + if (ret) { +>> > + dev_dbg(&controller->dev, "xfer error: %d\n", ret); +>> > + return ret; +>> > + } +>> > + +>> > + if (peci_request_status(req) != -EAGAIN) +>> > + return 0; +>> > + +>> > + /* Set the retry bit to indicate a retry attempt */ +>> > + req->tx.buf[1] |= PECI_RETRY_BIT; +>> > + +>> > + if (schedule_timeout_interruptible(wait_interval)) +>> > + return -ERESTARTSYS; +>> > + +>> > + wait_interval *= 2; +>> > + if (wait_interval > PECI_RETRY_INTERVAL_MAX) +>> > + wait_interval = PECI_RETRY_INTERVAL_MAX; >> >> wait_interval = min(wait_interval * 2, PECI_RETRY_INTERVAL_MAX) ? > >Ack. > >> ->> > +???????} while (time_before(jiffies, start + PECI_RETRY_TIMEOUT)); +>> > + } while (time_before(jiffies, start + PECI_RETRY_TIMEOUT)); >> > + ->> > +???????dev_dbg(&controller->dev, "request timed out\n"); +>> > + dev_dbg(&controller->dev, "request timed out\n"); >> > + ->> > +???????return -ETIMEDOUT; +>> > + return -ETIMEDOUT; >> > +} >> > + >> > /** ->> > ?* peci_request_alloc() - allocate &struct peci_request with buffers with +>> > * peci_request_alloc() - allocate &struct peci_request with buffers with >> > given lengths ->> > ?* @device: PECI device to which request is going to be sent +>> > * @device: PECI device to which request is going to be sent >> > @@ -72,3 +201,91 @@ void peci_request_free(struct peci_request *req) ->> > ????????kfree(req); +>> > kfree(req); >> > } >> > EXPORT_SYMBOL_NS_GPL(peci_request_free, PECI); >> > + >> > +struct peci_request *peci_get_dib(struct peci_device *device) >> > +{ ->> > +???????struct peci_request *req; ->> > +???????int ret; +>> > + struct peci_request *req; +>> > + int ret; >> > + ->> > +???????req = peci_request_alloc(device, PECI_GET_DIB_WR_LEN, +>> > + req = peci_request_alloc(device, PECI_GET_DIB_WR_LEN, >> > PECI_GET_DIB_RD_LEN); ->> > +???????if (!req) ->> > +???????????????return ERR_PTR(-ENOMEM); +>> > + if (!req) +>> > + return ERR_PTR(-ENOMEM); >> > + ->> > +???????req->tx.buf[0] = PECI_GET_DIB_CMD; +>> > + req->tx.buf[0] = PECI_GET_DIB_CMD; >> > + ->> > +???????ret = peci_request_xfer(req); ->> > +???????if (ret) { ->> > +???????????????peci_request_free(req); ->> > +???????????????return ERR_PTR(ret); ->> > +???????} +>> > + ret = peci_request_xfer(req); +>> > + if (ret) { +>> > + peci_request_free(req); +>> > + return ERR_PTR(ret); +>> > + } >> > + ->> > +???????return req; +>> > + return req; >> > +} >> > +EXPORT_SYMBOL_NS_GPL(peci_get_dib, PECI); >> > + >> > +static struct peci_request * >> > +__pkg_cfg_read(struct peci_device *device, u8 index, u16 param, u8 len) >> > +{ ->> > +???????struct peci_request *req; ->> > +???????int ret; ->> > + ->> > +???????req = peci_request_alloc(device, PECI_RDPKGCFG_WRITE_LEN, ->> > +??????????????????????????????? PECI_RDPKGCFG_READ_LEN_BASE + len); ->> > +???????if (!req) ->> > +???????????????return ERR_PTR(-ENOMEM); ->> > + ->> > +???????req->tx.buf[0] = PECI_RDPKGCFG_CMD; ->> > +???????req->tx.buf[1] = 0; ->> > +???????req->tx.buf[2] = index; ->> > +???????put_unaligned_le16(param, &req->tx.buf[3]); ->> > + ->> > +???????ret = peci_request_xfer_retry(req); ->> > +???????if (ret) { ->> > +???????????????peci_request_free(req); ->> > +???????????????return ERR_PTR(ret); ->> > +???????} ->> > + ->> > +???????return req; +>> > + struct peci_request *req; +>> > + int ret; +>> > + +>> > + req = peci_request_alloc(device, PECI_RDPKGCFG_WRITE_LEN, +>> > + PECI_RDPKGCFG_READ_LEN_BASE + len); +>> > + if (!req) +>> > + return ERR_PTR(-ENOMEM); +>> > + +>> > + req->tx.buf[0] = PECI_RDPKGCFG_CMD; +>> > + req->tx.buf[1] = 0; +>> > + req->tx.buf[2] = index; +>> > + put_unaligned_le16(param, &req->tx.buf[3]); +>> > + +>> > + ret = peci_request_xfer_retry(req); +>> > + if (ret) { +>> > + peci_request_free(req); +>> > + return ERR_PTR(ret); +>> > + } +>> > + +>> > + return req; >> > +} >> > + >> > +u8 peci_request_data_readb(struct peci_request *req) >> > +{ ->> > +???????return req->rx.buf[1]; +>> > + return req->rx.buf[1]; >> > +} >> > +EXPORT_SYMBOL_NS_GPL(peci_request_data_readb, PECI); >> > + >> > +u16 peci_request_data_readw(struct peci_request *req) >> > +{ ->> > +???????return get_unaligned_le16(&req->rx.buf[1]); +>> > + return get_unaligned_le16(&req->rx.buf[1]); >> > +} >> > +EXPORT_SYMBOL_NS_GPL(peci_request_data_readw, PECI); >> > + >> > +u32 peci_request_data_readl(struct peci_request *req) >> > +{ ->> > +???????return get_unaligned_le32(&req->rx.buf[1]); +>> > + return get_unaligned_le32(&req->rx.buf[1]); >> > +} >> > +EXPORT_SYMBOL_NS_GPL(peci_request_data_readl, PECI); >> > + >> > +u64 peci_request_data_readq(struct peci_request *req) >> > +{ ->> > +???????return get_unaligned_le64(&req->rx.buf[1]); +>> > + return get_unaligned_le64(&req->rx.buf[1]); >> > +} >> > +EXPORT_SYMBOL_NS_GPL(peci_request_data_readq, PECI); >> > + >> > +u64 peci_request_data_dib(struct peci_request *req) >> > +{ ->> > +???????return get_unaligned_le64(&req->rx.buf[0]); +>> > + return get_unaligned_le64(&req->rx.buf[0]); >> > +} >> > +EXPORT_SYMBOL_NS_GPL(peci_request_data_dib, PECI); >> > + @@ -637,10 +637,10 @@ written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >> > +struct peci_request *peci_pkg_cfg_##x(struct peci_device *device, u8 index, >> > u16 param) \ >> > +{ \ ->> > +???????return __pkg_cfg_read(device, index, param, sizeof(type)); \ +>> > + return __pkg_cfg_read(device, index, param, sizeof(type)); \ >> > +} \ >> ->> Is there a reason for this particular API?? I'd think a more natural one +>> Is there a reason for this particular API? I'd think a more natural one >> that would offload a bit of boilerplate from callers would look more like >> >> int peci_pkg_cfg_##x(struct peci_device *device, u8 index, u16 param, type @@ -672,42 +672,42 @@ written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >> > #include <linux/mutex.h> >> > #include <linux/types.h> >> > ->> > +#define PECI_PCS_PKG_ID????????????????????????0? /* Package Identifier +>> > +#define PECI_PCS_PKG_ID 0 /* Package Identifier >> > Read */ ->> > +#define? PECI_PKG_ID_CPU_ID????????????0x0000? /* CPUID Info */ ->> > +#define? PECI_PKG_ID_PLATFORM_ID???????0x0001? /* Platform ID */ ->> > +#define? PECI_PKG_ID_DEVICE_ID?????????0x0002? /* Uncore Device ID */ ->> > +#define? PECI_PKG_ID_MAX_THREAD_ID?????0x0003? /* Max Thread ID */ ->> > +#define? PECI_PKG_ID_MICROCODE_REV?????0x0004? /* CPU Microcode Update +>> > +#define PECI_PKG_ID_CPU_ID 0x0000 /* CPUID Info */ +>> > +#define PECI_PKG_ID_PLATFORM_ID 0x0001 /* Platform ID */ +>> > +#define PECI_PKG_ID_DEVICE_ID 0x0002 /* Uncore Device ID */ +>> > +#define PECI_PKG_ID_MAX_THREAD_ID 0x0003 /* Max Thread ID */ +>> > +#define PECI_PKG_ID_MICROCODE_REV 0x0004 /* CPU Microcode Update >> > Revision */ ->> > +#define? PECI_PKG_ID_MCA_ERROR_LOG?????0x0005? /* Machine Check Status */ +>> > +#define PECI_PKG_ID_MCA_ERROR_LOG 0x0005 /* Machine Check Status */ >> > + >> > struct peci_request; >> > >> > /** >> > @@ -41,6 +49,11 @@ static inline struct peci_controller >> > *to_peci_controller(void *d) ->> > ?* struct peci_device - PECI device ->> > ?* @dev: device object to register PECI device to the device model ->> > ?* @controller: manages the bus segment hosting this PECI device +>> > * struct peci_device - PECI device +>> > * @dev: device object to register PECI device to the device model +>> > * @controller: manages the bus segment hosting this PECI device >> > + * @info: PECI device characteristics >> > + * @info.family: device family >> > + * @info.model: device model >> > + * @info.peci_revision: PECI revision supported by the PECI device >> > + * @info.socket_id: the socket ID represented by the PECI device ->> > ?* @addr: address used on the PECI bus connected to the parent controller ->> > ?* ->> > ?* A peci_device identifies a single device (i.e. CPU) connected to a PECI +>> > * @addr: address used on the PECI bus connected to the parent controller +>> > * +>> > * A peci_device identifies a single device (i.e. CPU) connected to a PECI >> > bus. >> > @@ -50,6 +63,12 @@ static inline struct peci_controller >> > *to_peci_controller(void *d) >> > struct peci_device { ->> > ????????struct device dev; ->> > ????????struct peci_controller *controller; ->> > +???????struct { ->> > +???????????????u16 family; ->> > +???????????????u8 model; ->> > +???????????????u8 peci_revision; +>> > struct device dev; +>> > struct peci_controller *controller; +>> > + struct { +>> > + u16 family; +>> > + u8 model; +>> > + u8 peci_revision; >> >> This field gets set but doesn't seem to end up used anywhere; is it >> useful? @@ -722,9 +722,9 @@ written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >-Iwona > >> ->> > +???????????????u8 socket_id; ->> > +???????} info; ->> > ????????u8 addr; +>> > + u8 socket_id; +>> > + } info; +>> > u8 addr; >> > }; >> > >> > diff --git a/lib/Kconfig b/lib/Kconfig @@ -734,10 +734,10 @@ written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >> > @@ -721,5 +721,5 @@ config ASN1_ENCODER >> > >> > config GENERIC_LIB_X86 ->> > ????????bool ->> > -???????depends on X86 ->> > +???????depends on X86 || PECI ->> > ????????default n +>> > bool +>> > - depends on X86 +>> > + depends on X86 || PECI +>> > default n >> > -- >> > 2.31.1 > diff --git a/a/content_digest b/N2/content_digest index 315ee2f..3423deb 100644 --- a/a/content_digest +++ b/N2/content_digest @@ -3,9 +3,36 @@ "ref\020210727201028.GS8018@packtop\0" "ref\079f5b6ed4942ddeb66beea03907a58495376ccef.camel@intel.com\0" "From\0Zev Weiss <zweiss@equinix.com>\0" - "Subject\0[PATCH 09/14] peci: Add support for PECI device drivers\0" + "Subject\0Re: [PATCH 09/14] peci: Add support for PECI device drivers\0" "Date\0Thu, 29 Jul 2021 23:22:06 +0000\0" - "To\0linux-aspeed@lists.ozlabs.org\0" + "To\0Winiarska" + " Iwona <iwona.winiarska@intel.com>\0" + "Cc\0linux-aspeed@lists.ozlabs.org <linux-aspeed@lists.ozlabs.org>" + linux-doc@vger.kernel.org <linux-doc@vger.kernel.org> + jae.hyun.yoo@linux.intel.com <jae.hyun.yoo@linux.intel.com> + mchehab@kernel.org <mchehab@kernel.org> + corbet@lwn.net <corbet@lwn.net> + openbmc@lists.ozlabs.org <openbmc@lists.ozlabs.org> + x86@kernel.org <x86@kernel.org> + pierre-louis.bossart@linux.intel.com <pierre-louis.bossart@linux.intel.com> + mingo@redhat.com <mingo@redhat.com> + linux@roeck-us.net <linux@roeck-us.net> + devicetree@vger.kernel.org <devicetree@vger.kernel.org> + jdelvare@suse.com <jdelvare@suse.com> + robh+dt@kernel.org <robh+dt@kernel.org> + bp@alien8.de <bp@alien8.de> + Lutomirski + Andy <luto@kernel.org> + tglx@linutronix.de <tglx@linutronix.de> + andriy.shevchenko@linux.intel.com <andriy.shevchenko@linux.intel.com> + linux-arm-kernel@lists.infradead.org <linux-arm-kernel@lists.infradead.org> + linux-hwmon@vger.kernel.org <linux-hwmon@vger.kernel.org> + Luck + Tony <tony.luck@intel.com> + andrew@aj.id.au <andrew@aj.id.au> + gregkh@linuxfoundation.org <gregkh@linuxfoundation.org> + linux-kernel@vger.kernel.org <linux-kernel@vger.kernel.org> + " yazen.ghannam@amd.com <yazen.ghannam@amd.com>\0" "\00:1\0" "b\0" "On Thu, Jul 29, 2021 at 04:17:06PM CDT, Winiarska, Iwona wrote:\n" @@ -22,13 +49,13 @@ ">> > Signed-off-by: Iwona Winiarska <iwona.winiarska@intel.com>\n" ">> > Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>\n" ">> > ---\n" - ">> > drivers/peci/Kconfig??? |?? 1 +\n" - ">> > drivers/peci/core.c???? |? 49 +++++++++\n" - ">> > drivers/peci/device.c?? |? 99 ++++++++++++++++++\n" - ">> > drivers/peci/internal.h |? 75 ++++++++++++++\n" - ">> > drivers/peci/request.c? | 217 ++++++++++++++++++++++++++++++++++++++++\n" - ">> > include/linux/peci.h??? |? 19 ++++\n" - ">> > lib/Kconfig???????????? |?? 2 +-\n" + ">> > drivers/peci/Kconfig\302\240\302\240\302\240 |\302\240\302\240 1 +\n" + ">> > drivers/peci/core.c\302\240\302\240\302\240\302\240 |\302\240 49 +++++++++\n" + ">> > drivers/peci/device.c\302\240\302\240 |\302\240 99 ++++++++++++++++++\n" + ">> > drivers/peci/internal.h |\302\240 75 ++++++++++++++\n" + ">> > drivers/peci/request.c\302\240 | 217 ++++++++++++++++++++++++++++++++++++++++\n" + ">> > include/linux/peci.h\302\240\302\240\302\240 |\302\240 19 ++++\n" + ">> > lib/Kconfig\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 |\302\240\302\240 2 +-\n" ">> > 7 files changed, 461 insertions(+), 1 deletion(-)\n" ">> >\n" ">> > diff --git a/drivers/peci/Kconfig b/drivers/peci/Kconfig\n" @@ -38,11 +65,11 @@ ">> > @@ -2,6 +2,7 @@\n" ">> >\n" ">> > menuconfig PECI\n" - ">> > ????????tristate \"PECI support\"\n" - ">> > +???????select GENERIC_LIB_X86\n" - ">> > ????????help\n" - ">> > ????????? The Platform Environment Control Interface (PECI) is an interface\n" - ">> > ????????? that provides a communication channel to Intel processors and\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240tristate \"PECI support\"\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240select GENERIC_LIB_X86\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240help\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 The Platform Environment Control Interface (PECI) is an interface\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 that provides a communication channel to Intel processors and\n" ">> > diff --git a/drivers/peci/core.c b/drivers/peci/core.c\n" ">> > index ae7a9572cdf3..94426b7f2618 100644\n" ">> > --- a/drivers/peci/core.c\n" @@ -56,57 +83,57 @@ ">> > +peci_bus_match_device_id(const struct peci_device_id *id, struct\n" ">> > peci_device *device)\n" ">> > +{\n" - ">> > +???????while (id->family != 0) {\n" - ">> > +???????????????if (id->family == device->info.family &&\n" - ">> > +?????????????????? id->model == device->info.model)\n" - ">> > +???????????????????????return id;\n" - ">> > +???????????????id++;\n" - ">> > +???????}\n" - ">> > +\n" - ">> > +???????return NULL;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240while (id->family != 0) {\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (id->family == device->info.family &&\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 id->model == device->info.model)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return id;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240id++;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240}\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return NULL;\n" ">> > +}\n" ">> > +\n" ">> > +static int peci_bus_device_match(struct device *dev, struct device_driver\n" ">> > *drv)\n" ">> > +{\n" - ">> > +???????struct peci_device *device = to_peci_device(dev);\n" - ">> > +???????struct peci_driver *peci_drv = to_peci_driver(drv);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_device *device = to_peci_device(dev);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_driver *peci_drv = to_peci_driver(drv);\n" ">> > +\n" - ">> > +???????if (dev->type != &peci_device_type)\n" - ">> > +???????????????return 0;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (dev->type != &peci_device_type)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return 0;\n" ">> > +\n" - ">> > +???????if (peci_bus_match_device_id(peci_drv->id_table, device))\n" - ">> > +???????????????return 1;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (peci_bus_match_device_id(peci_drv->id_table, device))\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return 1;\n" ">> > +\n" - ">> > +???????return 0;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return 0;\n" ">> > +}\n" ">> > +\n" ">> > +static int peci_bus_device_probe(struct device *dev)\n" ">> > +{\n" - ">> > +???????struct peci_device *device = to_peci_device(dev);\n" - ">> > +???????struct peci_driver *driver = to_peci_driver(dev->driver);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_device *device = to_peci_device(dev);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_driver *driver = to_peci_driver(dev->driver);\n" ">> > +\n" - ">> > +???????return driver->probe(device, peci_bus_match_device_id(driver-\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return driver->probe(device, peci_bus_match_device_id(driver-\n" ">> > >id_table, device));\n" ">> > +}\n" ">> > +\n" ">> > +static int peci_bus_device_remove(struct device *dev)\n" ">> > +{\n" - ">> > +???????struct peci_device *device = to_peci_device(dev);\n" - ">> > +???????struct peci_driver *driver = to_peci_driver(dev->driver);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_device *device = to_peci_device(dev);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_driver *driver = to_peci_driver(dev->driver);\n" ">> > +\n" - ">> > +???????if (driver->remove)\n" - ">> > +???????????????driver->remove(device);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (driver->remove)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240driver->remove(device);\n" ">> > +\n" - ">> > +???????return 0;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return 0;\n" ">> > +}\n" ">> > +\n" ">> > struct bus_type peci_bus_type = {\n" - ">> > ????????.name???????????= \"peci\",\n" - ">> > +???????.match??????????= peci_bus_device_match,\n" - ">> > +???????.probe??????????= peci_bus_device_probe,\n" - ">> > +???????.remove?????????= peci_bus_device_remove,\n" - ">> > ????????.bus_groups?????= peci_bus_groups,\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240.name\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240= \"peci\",\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240.match\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240= peci_bus_device_match,\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240.probe\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240= peci_bus_device_probe,\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240.remove\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240= peci_bus_device_remove,\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240.bus_groups\302\240\302\240\302\240\302\240\302\240= peci_bus_groups,\n" ">> > };\n" ">> >\n" ">> > diff --git a/drivers/peci/device.c b/drivers/peci/device.c\n" @@ -127,19 +154,19 @@ ">> > +#define REVISION_NUM_MASK GENMASK(15, 8)\n" ">> > +static int peci_get_revision(struct peci_device *device, u8 *revision)\n" ">> > +{\n" - ">> > +???????struct peci_request *req;\n" - ">> > +???????u64 dib;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_request *req;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u64 dib;\n" ">> > +\n" - ">> > +???????req = peci_get_dib(device);\n" - ">> > +???????if (IS_ERR(req))\n" - ">> > +???????????????return PTR_ERR(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240req = peci_get_dib(device);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (IS_ERR(req))\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return PTR_ERR(req);\n" ">> > +\n" - ">> > +???????dib = peci_request_data_dib(req);\n" - ">> > +???????if (dib == 0) {\n" - ">> > +???????????????peci_request_free(req);\n" - ">> > +???????????????return -EIO;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240dib = peci_request_data_dib(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (dib == 0) {\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240peci_request_free(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return -EIO;\n" ">>\n" - ">> Any particular reason to check for zero specifically here?? It looks\n" + ">> Any particular reason to check for zero specifically here?\302\240 It looks\n" ">> like that would be a case where the host CPU responds and everything's\n" ">> otherwise fine, but the host just happened to send back a bunch of zeros\n" ">> for whatever reason -- which may not be a valid PECI revision number,\n" @@ -179,30 +206,30 @@ "written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case.\n" "\n" ">>\n" - ">> > +???????}\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240}\n" ">> > +\n" - ">> > +???????*revision = FIELD_GET(REVISION_NUM_MASK, dib);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240*revision = FIELD_GET(REVISION_NUM_MASK, dib);\n" ">> > +\n" - ">> > +???????peci_request_free(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240peci_request_free(req);\n" ">> > +\n" - ">> > +???????return 0;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return 0;\n" ">> > +}\n" ">> > +\n" ">> > +static int peci_get_cpu_id(struct peci_device *device, u32 *cpu_id)\n" ">> > +{\n" - ">> > +???????struct peci_request *req;\n" - ">> > +???????int ret;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_request *req;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240int ret;\n" ">> > +\n" - ">> > +???????req = peci_pkg_cfg_readl(device, PECI_PCS_PKG_ID,\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240req = peci_pkg_cfg_readl(device, PECI_PCS_PKG_ID,\n" ">> > PECI_PKG_ID_CPU_ID);\n" - ">> > +???????if (IS_ERR(req))\n" - ">> > +???????????????return PTR_ERR(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (IS_ERR(req))\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return PTR_ERR(req);\n" ">> > +\n" - ">> > +???????ret = peci_request_status(req);\n" - ">> > +???????if (ret)\n" - ">> > +???????????????goto out_req_free;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = peci_request_status(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240goto out_req_free;\n" ">> > +\n" - ">> > +???????*cpu_id = peci_request_data_readl(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240*cpu_id = peci_request_data_readl(req);\n" ">> > +out_req_free:\n" ">>\n" ">> As suggested on patch #8, I think it might be cleaner to stack-allocate\n" @@ -210,8 +237,8 @@ ">> calls in functions like this and hence might simplify it away entirely,\n" ">> but if this does remain like this we could just do\n" ">>\n" - ">> ????????if (!ret)\n" - ">> ????????????????*cpu_id = peci_request_data_readl(req);\n" + ">> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (!ret)\n" + ">> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240*cpu_id = peci_request_data_readl(req);\n" ">>\n" ">> instead of using a goto to skip a single line.\n" ">\n" @@ -221,87 +248,87 @@ ">case of peci requests.\n" ">\n" ">>\n" - ">> > +???????peci_request_free(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240peci_request_free(req);\n" ">> > +\n" - ">> > +???????return ret;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ret;\n" ">> > +}\n" ">> > +\n" ">> > +static int peci_device_info_init(struct peci_device *device)\n" ">> > +{\n" - ">> > +???????u8 revision;\n" - ">> > +???????u32 cpu_id;\n" - ">> > +???????int ret;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u8 revision;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u32 cpu_id;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240int ret;\n" ">> > +\n" - ">> > +???????ret = peci_get_cpu_id(device, &cpu_id);\n" - ">> > +???????if (ret)\n" - ">> > +???????????????return ret;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = peci_get_cpu_id(device, &cpu_id);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ret;\n" ">> > +\n" - ">> > +???????device->info.family = x86_family(cpu_id);\n" - ">> > +???????device->info.model = x86_model(cpu_id);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240device->info.family = x86_family(cpu_id);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240device->info.model = x86_model(cpu_id);\n" ">> > +\n" - ">> > +???????ret = peci_get_revision(device, &revision);\n" - ">> > +???????if (ret)\n" - ">> > +???????????????return ret;\n" - ">> > +???????device->info.peci_revision = revision;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = peci_get_revision(device, &revision);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ret;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240device->info.peci_revision = revision;\n" ">> > +\n" - ">> > +???????device->info.socket_id = device->addr - PECI_BASE_ADDR;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240device->info.socket_id = device->addr - PECI_BASE_ADDR;\n" ">> > +\n" - ">> > +???????return 0;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return 0;\n" ">> > +}\n" ">> > +\n" ">> > static int peci_detect(struct peci_controller *controller, u8 addr)\n" ">> > {\n" - ">> > ????????struct peci_request *req;\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_request *req;\n" ">> > @@ -75,6 +143,10 @@ int peci_device_create(struct peci_controller\n" ">> > *controller, u8 addr)\n" - ">> > ????????device->dev.bus = &peci_bus_type;\n" - ">> > ????????device->dev.type = &peci_device_type;\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240device->dev.bus = &peci_bus_type;\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240device->dev.type = &peci_device_type;\n" ">> >\n" - ">> > +???????ret = peci_device_info_init(device);\n" - ">> > +???????if (ret)\n" - ">> > +???????????????goto err_free;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = peci_device_info_init(device);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240goto err_free;\n" ">> > +\n" - ">> > ????????ret = dev_set_name(&device->dev, \"%d-%02x\", controller->id, device-\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = dev_set_name(&device->dev, \"%d-%02x\", controller->id, device-\n" ">> > >addr);\n" - ">> > ????????if (ret)\n" - ">> > ????????????????goto err_free;\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret)\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240goto err_free;\n" ">> > @@ -98,6 +170,33 @@ void peci_device_destroy(struct peci_device *device)\n" - ">> > ????????device_unregister(&device->dev);\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240device_unregister(&device->dev);\n" ">> > }\n" ">> >\n" ">> > +int __peci_driver_register(struct peci_driver *driver, struct module\n" ">> > *owner,\n" - ">> > +????????????????????????? const char *mod_name)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 const char *mod_name)\n" ">> > +{\n" - ">> > +???????driver->driver.bus = &peci_bus_type;\n" - ">> > +???????driver->driver.owner = owner;\n" - ">> > +???????driver->driver.mod_name = mod_name;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240driver->driver.bus = &peci_bus_type;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240driver->driver.owner = owner;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240driver->driver.mod_name = mod_name;\n" ">> > +\n" - ">> > +???????if (!driver->probe) {\n" - ">> > +???????????????pr_err(\"peci: trying to register driver without probe\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (!driver->probe) {\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240pr_err(\"peci: trying to register driver without probe\n" ">> > callback\\n\");\n" - ">> > +???????????????return -EINVAL;\n" - ">> > +???????}\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return -EINVAL;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240}\n" ">> > +\n" - ">> > +???????if (!driver->id_table) {\n" - ">> > +???????????????pr_err(\"peci: trying to register driver without device id\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (!driver->id_table) {\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240pr_err(\"peci: trying to register driver without device id\n" ">> > table\\n\");\n" - ">> > +???????????????return -EINVAL;\n" - ">> > +???????}\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return -EINVAL;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240}\n" ">> > +\n" - ">> > +???????return driver_register(&driver->driver);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return driver_register(&driver->driver);\n" ">> > +}\n" ">> > +EXPORT_SYMBOL_NS_GPL(__peci_driver_register, PECI);\n" ">> > +\n" ">> > +void peci_driver_unregister(struct peci_driver *driver)\n" ">> > +{\n" - ">> > +???????driver_unregister(&driver->driver);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240driver_unregister(&driver->driver);\n" ">> > +}\n" ">> > +EXPORT_SYMBOL_NS_GPL(peci_driver_unregister, PECI);\n" ">> > +\n" ">> > static void peci_device_release(struct device *dev)\n" ">> > {\n" - ">> > ????????struct peci_device *device = to_peci_device(dev);\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_device *device = to_peci_device(dev);\n" ">> > diff --git a/drivers/peci/internal.h b/drivers/peci/internal.h\n" ">> > index 6b139adaf6b8..c891c93e077a 100644\n" ">> > --- a/drivers/peci/internal.h\n" @@ -338,9 +365,9 @@ ">> > + * @model: device model\n" ">> > + */\n" ">> > +struct peci_device_id {\n" - ">> > +???????const void *data;\n" - ">> > +???????u16 family;\n" - ">> > +???????u8 model;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240const void *data;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u16 family;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u8 model;\n" ">> > +};\n" ">> > +\n" ">> > extern struct device_type peci_device_type;\n" @@ -358,21 +385,21 @@ ">> > + * @id_table: PECI device match table to decide which device to bind\n" ">> > + */\n" ">> > +struct peci_driver {\n" - ">> > +???????struct device_driver driver;\n" - ">> > +???????int (*probe)(struct peci_device *device, const struct peci_device_id\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct device_driver driver;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240int (*probe)(struct peci_device *device, const struct peci_device_id\n" ">> > *id);\n" - ">> > +???????void (*remove)(struct peci_device *device);\n" - ">> > +???????const struct peci_device_id *id_table;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240void (*remove)(struct peci_device *device);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240const struct peci_device_id *id_table;\n" ">> > +};\n" ">> > +\n" ">> > +static inline struct peci_driver *to_peci_driver(struct device_driver *d)\n" ">> > +{\n" - ">> > +???????return container_of(d, struct peci_driver, driver);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return container_of(d, struct peci_driver, driver);\n" ">> > +}\n" ">> > +\n" ">> > +int __peci_driver_register(struct peci_driver *driver, struct module\n" ">> > *owner,\n" - ">> > +????????????????????????? const char *mod_name);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 const char *mod_name);\n" ">> > +/**\n" ">> > + * peci_driver_register() - register PECI driver\n" ">> > + * @driver: the driver to be registered\n" @@ -386,7 +413,7 @@ ">> > + * Return: zero on success, else a negative error code.\n" ">> > + */\n" ">> > +#define peci_driver_register(driver) \\\n" - ">> > +???????__peci_driver_register(driver, THIS_MODULE, KBUILD_MODNAME)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240__peci_driver_register(driver, THIS_MODULE, KBUILD_MODNAME)\n" ">> > +void peci_driver_unregister(struct peci_driver *driver);\n" ">> > +\n" ">> > +/**\n" @@ -400,7 +427,7 @@ ">> > module_exit()\n" ">> > + */\n" ">> > +#define module_peci_driver(__peci_driver) \\\n" - ">> > +???????module_driver(__peci_driver, peci_driver_register,\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240module_driver(__peci_driver, peci_driver_register,\n" ">> > peci_driver_unregister)\n" ">> > +\n" ">> > extern struct device_type peci_controller_type;\n" @@ -424,39 +451,39 @@ ">> > +\n" ">> > #include \"internal.h\"\n" ">> >\n" - ">> > +#define PECI_GET_DIB_CMD???????????????0xf7\n" - ">> > +#define? PECI_GET_DIB_WR_LEN???????????1\n" - ">> > +#define? PECI_GET_DIB_RD_LEN???????????8\n" + ">> > +#define PECI_GET_DIB_CMD\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400xf7\n" + ">> > +#define\302\240 PECI_GET_DIB_WR_LEN\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2401\n" + ">> > +#define\302\240 PECI_GET_DIB_RD_LEN\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2408\n" ">> > +\n" - ">> > +#define PECI_RDPKGCFG_CMD??????????????0xa1\n" - ">> > +#define? PECI_RDPKGCFG_WRITE_LEN???????5\n" - ">> > +#define? PECI_RDPKGCFG_READ_LEN_BASE???1\n" - ">> > +#define PECI_WRPKGCFG_CMD??????????????0xa5\n" - ">> > +#define? PECI_WRPKGCFG_WRITE_LEN_BASE??6\n" - ">> > +#define? PECI_WRPKGCFG_READ_LEN????????????????1\n" + ">> > +#define PECI_RDPKGCFG_CMD\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400xa1\n" + ">> > +#define\302\240 PECI_RDPKGCFG_WRITE_LEN\302\240\302\240\302\240\302\240\302\240\302\240\302\2405\n" + ">> > +#define\302\240 PECI_RDPKGCFG_READ_LEN_BASE\302\240\302\240\302\2401\n" + ">> > +#define PECI_WRPKGCFG_CMD\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400xa5\n" + ">> > +#define\302\240 PECI_WRPKGCFG_WRITE_LEN_BASE\302\240\302\2406\n" + ">> > +#define\302\240 PECI_WRPKGCFG_READ_LEN\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2401\n" ">> > +\n" ">> > +/* Device Specific Completion Code (CC) Definition */\n" - ">> > +#define PECI_CC_SUCCESS????????????????????????????????0x40\n" - ">> > +#define PECI_CC_NEED_RETRY?????????????????????0x80\n" - ">> > +#define PECI_CC_OUT_OF_RESOURCE????????????????????????0x81\n" - ">> > +#define PECI_CC_UNAVAIL_RESOURCE???????????????0x82\n" - ">> > +#define PECI_CC_INVALID_REQ????????????????????0x90\n" - ">> > +#define PECI_CC_MCA_ERROR??????????????????????0x91\n" - ">> > +#define PECI_CC_CATASTROPHIC_MCA_ERROR?????????0x93\n" - ">> > +#define PECI_CC_FATAL_MCA_ERROR????????????????????????0x94\n" - ">> > +#define PECI_CC_PARITY_ERR_GPSB_OR_PMSB????????????????0x98\n" - ">> > +#define PECI_CC_PARITY_ERR_GPSB_OR_PMSB_IERR???0x9B\n" - ">> > +#define PECI_CC_PARITY_ERR_GPSB_OR_PMSB_MCA????0x9C\n" - ">> > +\n" - ">> > +#define PECI_RETRY_BIT?????????????????BIT(0)\n" - ">> > +\n" - ">> > +#define PECI_RETRY_TIMEOUT?????????????msecs_to_jiffies(700)\n" - ">> > +#define PECI_RETRY_INTERVAL_MIN????????????????msecs_to_jiffies(1)\n" - ">> > +#define PECI_RETRY_INTERVAL_MAX????????????????msecs_to_jiffies(128)\n" + ">> > +#define PECI_CC_SUCCESS\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400x40\n" + ">> > +#define PECI_CC_NEED_RETRY\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400x80\n" + ">> > +#define PECI_CC_OUT_OF_RESOURCE\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400x81\n" + ">> > +#define PECI_CC_UNAVAIL_RESOURCE\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400x82\n" + ">> > +#define PECI_CC_INVALID_REQ\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400x90\n" + ">> > +#define PECI_CC_MCA_ERROR\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400x91\n" + ">> > +#define PECI_CC_CATASTROPHIC_MCA_ERROR\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400x93\n" + ">> > +#define PECI_CC_FATAL_MCA_ERROR\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400x94\n" + ">> > +#define PECI_CC_PARITY_ERR_GPSB_OR_PMSB\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400x98\n" + ">> > +#define PECI_CC_PARITY_ERR_GPSB_OR_PMSB_IERR\302\240\302\240\302\2400x9B\n" + ">> > +#define PECI_CC_PARITY_ERR_GPSB_OR_PMSB_MCA\302\240\302\240\302\240\302\2400x9C\n" + ">> > +\n" + ">> > +#define PECI_RETRY_BIT\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240BIT(0)\n" + ">> > +\n" + ">> > +#define PECI_RETRY_TIMEOUT\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240msecs_to_jiffies(700)\n" + ">> > +#define PECI_RETRY_INTERVAL_MIN\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240msecs_to_jiffies(1)\n" + ">> > +#define PECI_RETRY_INTERVAL_MAX\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240msecs_to_jiffies(128)\n" ">> > +\n" ">> > +static u8 peci_request_data_cc(struct peci_request *req)\n" ">> > +{\n" - ">> > +???????return req->rx.buf[0];\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return req->rx.buf[0];\n" ">> > +}\n" ">> > +\n" ">> > +/**\n" @@ -471,175 +498,175 @@ ">> > + */\n" ">> > +int peci_request_status(struct peci_request *req)\n" ">> > +{\n" - ">> > +???????u8 cc = peci_request_data_cc(req);\n" - ">> > +\n" - ">> > +???????if (cc != PECI_CC_SUCCESS)\n" - ">> > +???????????????dev_dbg(&req->device->dev, \"ret: %#02x\\n\", cc);\n" - ">> > +\n" - ">> > +???????switch (cc) {\n" - ">> > +???????case PECI_CC_SUCCESS:\n" - ">> > +???????????????return 0;\n" - ">> > +???????case PECI_CC_NEED_RETRY:\n" - ">> > +???????case PECI_CC_OUT_OF_RESOURCE:\n" - ">> > +???????case PECI_CC_UNAVAIL_RESOURCE:\n" - ">> > +???????????????return -EAGAIN;\n" - ">> > +???????case PECI_CC_INVALID_REQ:\n" - ">> > +???????????????return -EINVAL;\n" - ">> > +???????case PECI_CC_MCA_ERROR:\n" - ">> > +???????case PECI_CC_CATASTROPHIC_MCA_ERROR:\n" - ">> > +???????case PECI_CC_FATAL_MCA_ERROR:\n" - ">> > +???????case PECI_CC_PARITY_ERR_GPSB_OR_PMSB:\n" - ">> > +???????case PECI_CC_PARITY_ERR_GPSB_OR_PMSB_IERR:\n" - ">> > +???????case PECI_CC_PARITY_ERR_GPSB_OR_PMSB_MCA:\n" - ">> > +???????????????return -EIO;\n" - ">> > +???????}\n" - ">> > +\n" - ">> > +???????WARN_ONCE(1, \"Unknown PECI completion code: %#02x\\n\", cc);\n" - ">> > +\n" - ">> > +???????return -EIO;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u8 cc = peci_request_data_cc(req);\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (cc != PECI_CC_SUCCESS)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240dev_dbg(&req->device->dev, \"ret: %#02x\\n\", cc);\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240switch (cc) {\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240case PECI_CC_SUCCESS:\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return 0;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240case PECI_CC_NEED_RETRY:\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240case PECI_CC_OUT_OF_RESOURCE:\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240case PECI_CC_UNAVAIL_RESOURCE:\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return -EAGAIN;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240case PECI_CC_INVALID_REQ:\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return -EINVAL;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240case PECI_CC_MCA_ERROR:\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240case PECI_CC_CATASTROPHIC_MCA_ERROR:\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240case PECI_CC_FATAL_MCA_ERROR:\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240case PECI_CC_PARITY_ERR_GPSB_OR_PMSB:\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240case PECI_CC_PARITY_ERR_GPSB_OR_PMSB_IERR:\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240case PECI_CC_PARITY_ERR_GPSB_OR_PMSB_MCA:\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return -EIO;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240}\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240WARN_ONCE(1, \"Unknown PECI completion code: %#02x\\n\", cc);\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return -EIO;\n" ">> > +}\n" ">> > +EXPORT_SYMBOL_NS_GPL(peci_request_status, PECI);\n" ">> > +\n" ">> > +static int peci_request_xfer(struct peci_request *req)\n" ">> > +{\n" - ">> > +???????struct peci_device *device = req->device;\n" - ">> > +???????struct peci_controller *controller = device->controller;\n" - ">> > +???????int ret;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_device *device = req->device;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_controller *controller = device->controller;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240int ret;\n" ">> > +\n" - ">> > +???????mutex_lock(&controller->bus_lock);\n" - ">> > +???????ret = controller->xfer(controller, device->addr, req);\n" - ">> > +???????mutex_unlock(&controller->bus_lock);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240mutex_lock(&controller->bus_lock);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = controller->xfer(controller, device->addr, req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240mutex_unlock(&controller->bus_lock);\n" ">> > +\n" - ">> > +???????return ret;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ret;\n" ">> > +}\n" ">> > +\n" ">> > +static int peci_request_xfer_retry(struct peci_request *req)\n" ">> > +{\n" - ">> > +???????long wait_interval = PECI_RETRY_INTERVAL_MIN;\n" - ">> > +???????struct peci_device *device = req->device;\n" - ">> > +???????struct peci_controller *controller = device->controller;\n" - ">> > +???????unsigned long start = jiffies;\n" - ">> > +???????int ret;\n" - ">> > +\n" - ">> > +???????/* Don't try to use it for ping */\n" - ">> > +???????if (WARN_ON(!req->rx.buf))\n" - ">> > +???????????????return 0;\n" - ">> > +\n" - ">> > +???????do {\n" - ">> > +???????????????ret = peci_request_xfer(req);\n" - ">> > +???????????????if (ret) {\n" - ">> > +???????????????????????dev_dbg(&controller->dev, \"xfer error: %d\\n\", ret);\n" - ">> > +???????????????????????return ret;\n" - ">> > +???????????????}\n" - ">> > +\n" - ">> > +???????????????if (peci_request_status(req) != -EAGAIN)\n" - ">> > +???????????????????????return 0;\n" - ">> > +\n" - ">> > +???????????????/* Set the retry bit to indicate a retry attempt */\n" - ">> > +???????????????req->tx.buf[1] |= PECI_RETRY_BIT;\n" - ">> > +\n" - ">> > +???????????????if (schedule_timeout_interruptible(wait_interval))\n" - ">> > +???????????????????????return -ERESTARTSYS;\n" - ">> > +\n" - ">> > +???????????????wait_interval *= 2;\n" - ">> > +???????????????if (wait_interval > PECI_RETRY_INTERVAL_MAX)\n" - ">> > +???????????????????????wait_interval = PECI_RETRY_INTERVAL_MAX;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240long wait_interval = PECI_RETRY_INTERVAL_MIN;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_device *device = req->device;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_controller *controller = device->controller;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240unsigned long start = jiffies;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240int ret;\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240/* Don't try to use it for ping */\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (WARN_ON(!req->rx.buf))\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return 0;\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240do {\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = peci_request_xfer(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret) {\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240dev_dbg(&controller->dev, \"xfer error: %d\\n\", ret);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ret;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240}\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (peci_request_status(req) != -EAGAIN)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return 0;\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240/* Set the retry bit to indicate a retry attempt */\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240req->tx.buf[1] |= PECI_RETRY_BIT;\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (schedule_timeout_interruptible(wait_interval))\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return -ERESTARTSYS;\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240wait_interval *= 2;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (wait_interval > PECI_RETRY_INTERVAL_MAX)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240wait_interval = PECI_RETRY_INTERVAL_MAX;\n" ">>\n" ">> wait_interval = min(wait_interval * 2, PECI_RETRY_INTERVAL_MAX) ?\n" ">\n" ">Ack.\n" ">\n" ">>\n" - ">> > +???????} while (time_before(jiffies, start + PECI_RETRY_TIMEOUT));\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240} while (time_before(jiffies, start + PECI_RETRY_TIMEOUT));\n" ">> > +\n" - ">> > +???????dev_dbg(&controller->dev, \"request timed out\\n\");\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240dev_dbg(&controller->dev, \"request timed out\\n\");\n" ">> > +\n" - ">> > +???????return -ETIMEDOUT;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return -ETIMEDOUT;\n" ">> > +}\n" ">> > +\n" ">> > /**\n" - ">> > ?* peci_request_alloc() - allocate &struct peci_request with buffers with\n" + ">> > \302\240* peci_request_alloc() - allocate &struct peci_request with buffers with\n" ">> > given lengths\n" - ">> > ?* @device: PECI device to which request is going to be sent\n" + ">> > \302\240* @device: PECI device to which request is going to be sent\n" ">> > @@ -72,3 +201,91 @@ void peci_request_free(struct peci_request *req)\n" - ">> > ????????kfree(req);\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240kfree(req);\n" ">> > }\n" ">> > EXPORT_SYMBOL_NS_GPL(peci_request_free, PECI);\n" ">> > +\n" ">> > +struct peci_request *peci_get_dib(struct peci_device *device)\n" ">> > +{\n" - ">> > +???????struct peci_request *req;\n" - ">> > +???????int ret;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_request *req;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240int ret;\n" ">> > +\n" - ">> > +???????req = peci_request_alloc(device, PECI_GET_DIB_WR_LEN,\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240req = peci_request_alloc(device, PECI_GET_DIB_WR_LEN,\n" ">> > PECI_GET_DIB_RD_LEN);\n" - ">> > +???????if (!req)\n" - ">> > +???????????????return ERR_PTR(-ENOMEM);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (!req)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ERR_PTR(-ENOMEM);\n" ">> > +\n" - ">> > +???????req->tx.buf[0] = PECI_GET_DIB_CMD;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240req->tx.buf[0] = PECI_GET_DIB_CMD;\n" ">> > +\n" - ">> > +???????ret = peci_request_xfer(req);\n" - ">> > +???????if (ret) {\n" - ">> > +???????????????peci_request_free(req);\n" - ">> > +???????????????return ERR_PTR(ret);\n" - ">> > +???????}\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = peci_request_xfer(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret) {\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240peci_request_free(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ERR_PTR(ret);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240}\n" ">> > +\n" - ">> > +???????return req;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return req;\n" ">> > +}\n" ">> > +EXPORT_SYMBOL_NS_GPL(peci_get_dib, PECI);\n" ">> > +\n" ">> > +static struct peci_request *\n" ">> > +__pkg_cfg_read(struct peci_device *device, u8 index, u16 param, u8 len)\n" ">> > +{\n" - ">> > +???????struct peci_request *req;\n" - ">> > +???????int ret;\n" - ">> > +\n" - ">> > +???????req = peci_request_alloc(device, PECI_RDPKGCFG_WRITE_LEN,\n" - ">> > +??????????????????????????????? PECI_RDPKGCFG_READ_LEN_BASE + len);\n" - ">> > +???????if (!req)\n" - ">> > +???????????????return ERR_PTR(-ENOMEM);\n" - ">> > +\n" - ">> > +???????req->tx.buf[0] = PECI_RDPKGCFG_CMD;\n" - ">> > +???????req->tx.buf[1] = 0;\n" - ">> > +???????req->tx.buf[2] = index;\n" - ">> > +???????put_unaligned_le16(param, &req->tx.buf[3]);\n" - ">> > +\n" - ">> > +???????ret = peci_request_xfer_retry(req);\n" - ">> > +???????if (ret) {\n" - ">> > +???????????????peci_request_free(req);\n" - ">> > +???????????????return ERR_PTR(ret);\n" - ">> > +???????}\n" - ">> > +\n" - ">> > +???????return req;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_request *req;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240int ret;\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240req = peci_request_alloc(device, PECI_RDPKGCFG_WRITE_LEN,\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 PECI_RDPKGCFG_READ_LEN_BASE + len);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (!req)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ERR_PTR(-ENOMEM);\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240req->tx.buf[0] = PECI_RDPKGCFG_CMD;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240req->tx.buf[1] = 0;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240req->tx.buf[2] = index;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240put_unaligned_le16(param, &req->tx.buf[3]);\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = peci_request_xfer_retry(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret) {\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240peci_request_free(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ERR_PTR(ret);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240}\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return req;\n" ">> > +}\n" ">> > +\n" ">> > +u8 peci_request_data_readb(struct peci_request *req)\n" ">> > +{\n" - ">> > +???????return req->rx.buf[1];\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return req->rx.buf[1];\n" ">> > +}\n" ">> > +EXPORT_SYMBOL_NS_GPL(peci_request_data_readb, PECI);\n" ">> > +\n" ">> > +u16 peci_request_data_readw(struct peci_request *req)\n" ">> > +{\n" - ">> > +???????return get_unaligned_le16(&req->rx.buf[1]);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return get_unaligned_le16(&req->rx.buf[1]);\n" ">> > +}\n" ">> > +EXPORT_SYMBOL_NS_GPL(peci_request_data_readw, PECI);\n" ">> > +\n" ">> > +u32 peci_request_data_readl(struct peci_request *req)\n" ">> > +{\n" - ">> > +???????return get_unaligned_le32(&req->rx.buf[1]);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return get_unaligned_le32(&req->rx.buf[1]);\n" ">> > +}\n" ">> > +EXPORT_SYMBOL_NS_GPL(peci_request_data_readl, PECI);\n" ">> > +\n" ">> > +u64 peci_request_data_readq(struct peci_request *req)\n" ">> > +{\n" - ">> > +???????return get_unaligned_le64(&req->rx.buf[1]);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return get_unaligned_le64(&req->rx.buf[1]);\n" ">> > +}\n" ">> > +EXPORT_SYMBOL_NS_GPL(peci_request_data_readq, PECI);\n" ">> > +\n" ">> > +u64 peci_request_data_dib(struct peci_request *req)\n" ">> > +{\n" - ">> > +???????return get_unaligned_le64(&req->rx.buf[0]);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return get_unaligned_le64(&req->rx.buf[0]);\n" ">> > +}\n" ">> > +EXPORT_SYMBOL_NS_GPL(peci_request_data_dib, PECI);\n" ">> > +\n" @@ -647,10 +674,10 @@ ">> > +struct peci_request *peci_pkg_cfg_##x(struct peci_device *device, u8 index,\n" ">> > u16 param) \\\n" ">> > +{ \\\n" - ">> > +???????return __pkg_cfg_read(device, index, param, sizeof(type)); \\\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return __pkg_cfg_read(device, index, param, sizeof(type)); \\\n" ">> > +} \\\n" ">>\n" - ">> Is there a reason for this particular API?? I'd think a more natural one\n" + ">> Is there a reason for this particular API?\302\240 I'd think a more natural one\n" ">> that would offload a bit of boilerplate from callers would look more like\n" ">>\n" ">> int peci_pkg_cfg_##x(struct peci_device *device, u8 index, u16 param, type\n" @@ -682,42 +709,42 @@ ">> > #include <linux/mutex.h>\n" ">> > #include <linux/types.h>\n" ">> >\n" - ">> > +#define PECI_PCS_PKG_ID????????????????????????0? /* Package Identifier\n" + ">> > +#define PECI_PCS_PKG_ID\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400\302\240 /* Package Identifier\n" ">> > Read */\n" - ">> > +#define? PECI_PKG_ID_CPU_ID????????????0x0000? /* CPUID Info */\n" - ">> > +#define? PECI_PKG_ID_PLATFORM_ID???????0x0001? /* Platform ID */\n" - ">> > +#define? PECI_PKG_ID_DEVICE_ID?????????0x0002? /* Uncore Device ID */\n" - ">> > +#define? PECI_PKG_ID_MAX_THREAD_ID?????0x0003? /* Max Thread ID */\n" - ">> > +#define? PECI_PKG_ID_MICROCODE_REV?????0x0004? /* CPU Microcode Update\n" + ">> > +#define\302\240 PECI_PKG_ID_CPU_ID\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400x0000\302\240 /* CPUID Info */\n" + ">> > +#define\302\240 PECI_PKG_ID_PLATFORM_ID\302\240\302\240\302\240\302\240\302\240\302\240\302\2400x0001\302\240 /* Platform ID */\n" + ">> > +#define\302\240 PECI_PKG_ID_DEVICE_ID\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400x0002\302\240 /* Uncore Device ID */\n" + ">> > +#define\302\240 PECI_PKG_ID_MAX_THREAD_ID\302\240\302\240\302\240\302\240\302\2400x0003\302\240 /* Max Thread ID */\n" + ">> > +#define\302\240 PECI_PKG_ID_MICROCODE_REV\302\240\302\240\302\240\302\240\302\2400x0004\302\240 /* CPU Microcode Update\n" ">> > Revision */\n" - ">> > +#define? PECI_PKG_ID_MCA_ERROR_LOG?????0x0005? /* Machine Check Status */\n" + ">> > +#define\302\240 PECI_PKG_ID_MCA_ERROR_LOG\302\240\302\240\302\240\302\240\302\2400x0005\302\240 /* Machine Check Status */\n" ">> > +\n" ">> > struct peci_request;\n" ">> >\n" ">> > /**\n" ">> > @@ -41,6 +49,11 @@ static inline struct peci_controller\n" ">> > *to_peci_controller(void *d)\n" - ">> > ?* struct peci_device - PECI device\n" - ">> > ?* @dev: device object to register PECI device to the device model\n" - ">> > ?* @controller: manages the bus segment hosting this PECI device\n" + ">> > \302\240* struct peci_device - PECI device\n" + ">> > \302\240* @dev: device object to register PECI device to the device model\n" + ">> > \302\240* @controller: manages the bus segment hosting this PECI device\n" ">> > + * @info: PECI device characteristics\n" ">> > + * @info.family: device family\n" ">> > + * @info.model: device model\n" ">> > + * @info.peci_revision: PECI revision supported by the PECI device\n" ">> > + * @info.socket_id: the socket ID represented by the PECI device\n" - ">> > ?* @addr: address used on the PECI bus connected to the parent controller\n" - ">> > ?*\n" - ">> > ?* A peci_device identifies a single device (i.e. CPU) connected to a PECI\n" + ">> > \302\240* @addr: address used on the PECI bus connected to the parent controller\n" + ">> > \302\240*\n" + ">> > \302\240* A peci_device identifies a single device (i.e. CPU) connected to a PECI\n" ">> > bus.\n" ">> > @@ -50,6 +63,12 @@ static inline struct peci_controller\n" ">> > *to_peci_controller(void *d)\n" ">> > struct peci_device {\n" - ">> > ????????struct device dev;\n" - ">> > ????????struct peci_controller *controller;\n" - ">> > +???????struct {\n" - ">> > +???????????????u16 family;\n" - ">> > +???????????????u8 model;\n" - ">> > +???????????????u8 peci_revision;\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct device dev;\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_controller *controller;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct {\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240u16 family;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240u8 model;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240u8 peci_revision;\n" ">>\n" ">> This field gets set but doesn't seem to end up used anywhere; is it\n" ">> useful?\n" @@ -732,9 +759,9 @@ ">-Iwona\n" ">\n" ">>\n" - ">> > +???????????????u8 socket_id;\n" - ">> > +???????} info;\n" - ">> > ????????u8 addr;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240u8 socket_id;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240} info;\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240u8 addr;\n" ">> > };\n" ">> >\n" ">> > diff --git a/lib/Kconfig b/lib/Kconfig\n" @@ -744,12 +771,12 @@ ">> > @@ -721,5 +721,5 @@ config ASN1_ENCODER\n" ">> >\n" ">> > config GENERIC_LIB_X86\n" - ">> > ????????bool\n" - ">> > -???????depends on X86\n" - ">> > +???????depends on X86 || PECI\n" - ">> > ????????default n\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240bool\n" + ">> > -\302\240\302\240\302\240\302\240\302\240\302\240\302\240depends on X86\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240depends on X86 || PECI\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240default n\n" ">> > --\n" ">> > 2.31.1\n" > -59cebbc101d3bc33ab3be319d67420d863e647d7adc3ae35d9c3e03b17c38743 +c610e83a4892f15c1b998bbf97e876872475ce1b47bcdcabe271aa8d53b00359
diff --git a/a/1.txt b/N3/1.txt index bd6a626..fa193f8 100644 --- a/a/1.txt +++ b/N3/1.txt @@ -12,13 +12,13 @@ On Thu, Jul 29, 2021 at 04:17:06PM CDT, Winiarska, Iwona wrote: >> > Signed-off-by: Iwona Winiarska <iwona.winiarska@intel.com> >> > Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> >> > --- ->> > drivers/peci/Kconfig??? |?? 1 + ->> > drivers/peci/core.c???? |? 49 +++++++++ ->> > drivers/peci/device.c?? |? 99 ++++++++++++++++++ ->> > drivers/peci/internal.h |? 75 ++++++++++++++ ->> > drivers/peci/request.c? | 217 ++++++++++++++++++++++++++++++++++++++++ ->> > include/linux/peci.h??? |? 19 ++++ ->> > lib/Kconfig???????????? |?? 2 +- +>> > drivers/peci/Kconfig | 1 + +>> > drivers/peci/core.c | 49 +++++++++ +>> > drivers/peci/device.c | 99 ++++++++++++++++++ +>> > drivers/peci/internal.h | 75 ++++++++++++++ +>> > drivers/peci/request.c | 217 ++++++++++++++++++++++++++++++++++++++++ +>> > include/linux/peci.h | 19 ++++ +>> > lib/Kconfig | 2 +- >> > 7 files changed, 461 insertions(+), 1 deletion(-) >> > >> > diff --git a/drivers/peci/Kconfig b/drivers/peci/Kconfig @@ -28,11 +28,11 @@ On Thu, Jul 29, 2021 at 04:17:06PM CDT, Winiarska, Iwona wrote: >> > @@ -2,6 +2,7 @@ >> > >> > menuconfig PECI ->> > ????????tristate "PECI support" ->> > +???????select GENERIC_LIB_X86 ->> > ????????help ->> > ????????? The Platform Environment Control Interface (PECI) is an interface ->> > ????????? that provides a communication channel to Intel processors and +>> > tristate "PECI support" +>> > + select GENERIC_LIB_X86 +>> > help +>> > The Platform Environment Control Interface (PECI) is an interface +>> > that provides a communication channel to Intel processors and >> > diff --git a/drivers/peci/core.c b/drivers/peci/core.c >> > index ae7a9572cdf3..94426b7f2618 100644 >> > --- a/drivers/peci/core.c @@ -46,57 +46,57 @@ On Thu, Jul 29, 2021 at 04:17:06PM CDT, Winiarska, Iwona wrote: >> > +peci_bus_match_device_id(const struct peci_device_id *id, struct >> > peci_device *device) >> > +{ ->> > +???????while (id->family != 0) { ->> > +???????????????if (id->family == device->info.family && ->> > +?????????????????? id->model == device->info.model) ->> > +???????????????????????return id; ->> > +???????????????id++; ->> > +???????} ->> > + ->> > +???????return NULL; +>> > + while (id->family != 0) { +>> > + if (id->family == device->info.family && +>> > + id->model == device->info.model) +>> > + return id; +>> > + id++; +>> > + } +>> > + +>> > + return NULL; >> > +} >> > + >> > +static int peci_bus_device_match(struct device *dev, struct device_driver >> > *drv) >> > +{ ->> > +???????struct peci_device *device = to_peci_device(dev); ->> > +???????struct peci_driver *peci_drv = to_peci_driver(drv); +>> > + struct peci_device *device = to_peci_device(dev); +>> > + struct peci_driver *peci_drv = to_peci_driver(drv); >> > + ->> > +???????if (dev->type != &peci_device_type) ->> > +???????????????return 0; +>> > + if (dev->type != &peci_device_type) +>> > + return 0; >> > + ->> > +???????if (peci_bus_match_device_id(peci_drv->id_table, device)) ->> > +???????????????return 1; +>> > + if (peci_bus_match_device_id(peci_drv->id_table, device)) +>> > + return 1; >> > + ->> > +???????return 0; +>> > + return 0; >> > +} >> > + >> > +static int peci_bus_device_probe(struct device *dev) >> > +{ ->> > +???????struct peci_device *device = to_peci_device(dev); ->> > +???????struct peci_driver *driver = to_peci_driver(dev->driver); +>> > + struct peci_device *device = to_peci_device(dev); +>> > + struct peci_driver *driver = to_peci_driver(dev->driver); >> > + ->> > +???????return driver->probe(device, peci_bus_match_device_id(driver- +>> > + return driver->probe(device, peci_bus_match_device_id(driver- >> > >id_table, device)); >> > +} >> > + >> > +static int peci_bus_device_remove(struct device *dev) >> > +{ ->> > +???????struct peci_device *device = to_peci_device(dev); ->> > +???????struct peci_driver *driver = to_peci_driver(dev->driver); +>> > + struct peci_device *device = to_peci_device(dev); +>> > + struct peci_driver *driver = to_peci_driver(dev->driver); >> > + ->> > +???????if (driver->remove) ->> > +???????????????driver->remove(device); +>> > + if (driver->remove) +>> > + driver->remove(device); >> > + ->> > +???????return 0; +>> > + return 0; >> > +} >> > + >> > struct bus_type peci_bus_type = { ->> > ????????.name???????????= "peci", ->> > +???????.match??????????= peci_bus_device_match, ->> > +???????.probe??????????= peci_bus_device_probe, ->> > +???????.remove?????????= peci_bus_device_remove, ->> > ????????.bus_groups?????= peci_bus_groups, +>> > .name = "peci", +>> > + .match = peci_bus_device_match, +>> > + .probe = peci_bus_device_probe, +>> > + .remove = peci_bus_device_remove, +>> > .bus_groups = peci_bus_groups, >> > }; >> > >> > diff --git a/drivers/peci/device.c b/drivers/peci/device.c @@ -117,19 +117,19 @@ On Thu, Jul 29, 2021 at 04:17:06PM CDT, Winiarska, Iwona wrote: >> > +#define REVISION_NUM_MASK GENMASK(15, 8) >> > +static int peci_get_revision(struct peci_device *device, u8 *revision) >> > +{ ->> > +???????struct peci_request *req; ->> > +???????u64 dib; +>> > + struct peci_request *req; +>> > + u64 dib; >> > + ->> > +???????req = peci_get_dib(device); ->> > +???????if (IS_ERR(req)) ->> > +???????????????return PTR_ERR(req); +>> > + req = peci_get_dib(device); +>> > + if (IS_ERR(req)) +>> > + return PTR_ERR(req); >> > + ->> > +???????dib = peci_request_data_dib(req); ->> > +???????if (dib == 0) { ->> > +???????????????peci_request_free(req); ->> > +???????????????return -EIO; +>> > + dib = peci_request_data_dib(req); +>> > + if (dib == 0) { +>> > + peci_request_free(req); +>> > + return -EIO; >> ->> Any particular reason to check for zero specifically here?? It looks +>> Any particular reason to check for zero specifically here? It looks >> like that would be a case where the host CPU responds and everything's >> otherwise fine, but the host just happened to send back a bunch of zeros >> for whatever reason -- which may not be a valid PECI revision number, @@ -169,30 +169,30 @@ I suppose it facilitates an easy zero check, but that could also be written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >> ->> > +???????} +>> > + } >> > + ->> > +???????*revision = FIELD_GET(REVISION_NUM_MASK, dib); +>> > + *revision = FIELD_GET(REVISION_NUM_MASK, dib); >> > + ->> > +???????peci_request_free(req); +>> > + peci_request_free(req); >> > + ->> > +???????return 0; +>> > + return 0; >> > +} >> > + >> > +static int peci_get_cpu_id(struct peci_device *device, u32 *cpu_id) >> > +{ ->> > +???????struct peci_request *req; ->> > +???????int ret; +>> > + struct peci_request *req; +>> > + int ret; >> > + ->> > +???????req = peci_pkg_cfg_readl(device, PECI_PCS_PKG_ID, +>> > + req = peci_pkg_cfg_readl(device, PECI_PCS_PKG_ID, >> > PECI_PKG_ID_CPU_ID); ->> > +???????if (IS_ERR(req)) ->> > +???????????????return PTR_ERR(req); +>> > + if (IS_ERR(req)) +>> > + return PTR_ERR(req); >> > + ->> > +???????ret = peci_request_status(req); ->> > +???????if (ret) ->> > +???????????????goto out_req_free; +>> > + ret = peci_request_status(req); +>> > + if (ret) +>> > + goto out_req_free; >> > + ->> > +???????*cpu_id = peci_request_data_readl(req); +>> > + *cpu_id = peci_request_data_readl(req); >> > +out_req_free: >> >> As suggested on patch #8, I think it might be cleaner to stack-allocate @@ -200,8 +200,8 @@ written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >> calls in functions like this and hence might simplify it away entirely, >> but if this does remain like this we could just do >> ->> ????????if (!ret) ->> ????????????????*cpu_id = peci_request_data_readl(req); +>> if (!ret) +>> *cpu_id = peci_request_data_readl(req); >> >> instead of using a goto to skip a single line. > @@ -211,87 +211,87 @@ written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >case of peci requests. > >> ->> > +???????peci_request_free(req); +>> > + peci_request_free(req); >> > + ->> > +???????return ret; +>> > + return ret; >> > +} >> > + >> > +static int peci_device_info_init(struct peci_device *device) >> > +{ ->> > +???????u8 revision; ->> > +???????u32 cpu_id; ->> > +???????int ret; +>> > + u8 revision; +>> > + u32 cpu_id; +>> > + int ret; >> > + ->> > +???????ret = peci_get_cpu_id(device, &cpu_id); ->> > +???????if (ret) ->> > +???????????????return ret; +>> > + ret = peci_get_cpu_id(device, &cpu_id); +>> > + if (ret) +>> > + return ret; >> > + ->> > +???????device->info.family = x86_family(cpu_id); ->> > +???????device->info.model = x86_model(cpu_id); +>> > + device->info.family = x86_family(cpu_id); +>> > + device->info.model = x86_model(cpu_id); >> > + ->> > +???????ret = peci_get_revision(device, &revision); ->> > +???????if (ret) ->> > +???????????????return ret; ->> > +???????device->info.peci_revision = revision; +>> > + ret = peci_get_revision(device, &revision); +>> > + if (ret) +>> > + return ret; +>> > + device->info.peci_revision = revision; >> > + ->> > +???????device->info.socket_id = device->addr - PECI_BASE_ADDR; +>> > + device->info.socket_id = device->addr - PECI_BASE_ADDR; >> > + ->> > +???????return 0; +>> > + return 0; >> > +} >> > + >> > static int peci_detect(struct peci_controller *controller, u8 addr) >> > { ->> > ????????struct peci_request *req; +>> > struct peci_request *req; >> > @@ -75,6 +143,10 @@ int peci_device_create(struct peci_controller >> > *controller, u8 addr) ->> > ????????device->dev.bus = &peci_bus_type; ->> > ????????device->dev.type = &peci_device_type; +>> > device->dev.bus = &peci_bus_type; +>> > device->dev.type = &peci_device_type; >> > ->> > +???????ret = peci_device_info_init(device); ->> > +???????if (ret) ->> > +???????????????goto err_free; +>> > + ret = peci_device_info_init(device); +>> > + if (ret) +>> > + goto err_free; >> > + ->> > ????????ret = dev_set_name(&device->dev, "%d-%02x", controller->id, device- +>> > ret = dev_set_name(&device->dev, "%d-%02x", controller->id, device- >> > >addr); ->> > ????????if (ret) ->> > ????????????????goto err_free; +>> > if (ret) +>> > goto err_free; >> > @@ -98,6 +170,33 @@ void peci_device_destroy(struct peci_device *device) ->> > ????????device_unregister(&device->dev); +>> > device_unregister(&device->dev); >> > } >> > >> > +int __peci_driver_register(struct peci_driver *driver, struct module >> > *owner, ->> > +????????????????????????? const char *mod_name) +>> > + const char *mod_name) >> > +{ ->> > +???????driver->driver.bus = &peci_bus_type; ->> > +???????driver->driver.owner = owner; ->> > +???????driver->driver.mod_name = mod_name; +>> > + driver->driver.bus = &peci_bus_type; +>> > + driver->driver.owner = owner; +>> > + driver->driver.mod_name = mod_name; >> > + ->> > +???????if (!driver->probe) { ->> > +???????????????pr_err("peci: trying to register driver without probe +>> > + if (!driver->probe) { +>> > + pr_err("peci: trying to register driver without probe >> > callback\n"); ->> > +???????????????return -EINVAL; ->> > +???????} +>> > + return -EINVAL; +>> > + } >> > + ->> > +???????if (!driver->id_table) { ->> > +???????????????pr_err("peci: trying to register driver without device id +>> > + if (!driver->id_table) { +>> > + pr_err("peci: trying to register driver without device id >> > table\n"); ->> > +???????????????return -EINVAL; ->> > +???????} +>> > + return -EINVAL; +>> > + } >> > + ->> > +???????return driver_register(&driver->driver); +>> > + return driver_register(&driver->driver); >> > +} >> > +EXPORT_SYMBOL_NS_GPL(__peci_driver_register, PECI); >> > + >> > +void peci_driver_unregister(struct peci_driver *driver) >> > +{ ->> > +???????driver_unregister(&driver->driver); +>> > + driver_unregister(&driver->driver); >> > +} >> > +EXPORT_SYMBOL_NS_GPL(peci_driver_unregister, PECI); >> > + >> > static void peci_device_release(struct device *dev) >> > { ->> > ????????struct peci_device *device = to_peci_device(dev); +>> > struct peci_device *device = to_peci_device(dev); >> > diff --git a/drivers/peci/internal.h b/drivers/peci/internal.h >> > index 6b139adaf6b8..c891c93e077a 100644 >> > --- a/drivers/peci/internal.h @@ -328,9 +328,9 @@ written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >> > + * @model: device model >> > + */ >> > +struct peci_device_id { ->> > +???????const void *data; ->> > +???????u16 family; ->> > +???????u8 model; +>> > + const void *data; +>> > + u16 family; +>> > + u8 model; >> > +}; >> > + >> > extern struct device_type peci_device_type; @@ -348,21 +348,21 @@ written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >> > + * @id_table: PECI device match table to decide which device to bind >> > + */ >> > +struct peci_driver { ->> > +???????struct device_driver driver; ->> > +???????int (*probe)(struct peci_device *device, const struct peci_device_id +>> > + struct device_driver driver; +>> > + int (*probe)(struct peci_device *device, const struct peci_device_id >> > *id); ->> > +???????void (*remove)(struct peci_device *device); ->> > +???????const struct peci_device_id *id_table; +>> > + void (*remove)(struct peci_device *device); +>> > + const struct peci_device_id *id_table; >> > +}; >> > + >> > +static inline struct peci_driver *to_peci_driver(struct device_driver *d) >> > +{ ->> > +???????return container_of(d, struct peci_driver, driver); +>> > + return container_of(d, struct peci_driver, driver); >> > +} >> > + >> > +int __peci_driver_register(struct peci_driver *driver, struct module >> > *owner, ->> > +????????????????????????? const char *mod_name); +>> > + const char *mod_name); >> > +/** >> > + * peci_driver_register() - register PECI driver >> > + * @driver: the driver to be registered @@ -376,7 +376,7 @@ written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >> > + * Return: zero on success, else a negative error code. >> > + */ >> > +#define peci_driver_register(driver) \ ->> > +???????__peci_driver_register(driver, THIS_MODULE, KBUILD_MODNAME) +>> > + __peci_driver_register(driver, THIS_MODULE, KBUILD_MODNAME) >> > +void peci_driver_unregister(struct peci_driver *driver); >> > + >> > +/** @@ -390,7 +390,7 @@ written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >> > module_exit() >> > + */ >> > +#define module_peci_driver(__peci_driver) \ ->> > +???????module_driver(__peci_driver, peci_driver_register, +>> > + module_driver(__peci_driver, peci_driver_register, >> > peci_driver_unregister) >> > + >> > extern struct device_type peci_controller_type; @@ -414,39 +414,39 @@ written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >> > + >> > #include "internal.h" >> > ->> > +#define PECI_GET_DIB_CMD???????????????0xf7 ->> > +#define? PECI_GET_DIB_WR_LEN???????????1 ->> > +#define? PECI_GET_DIB_RD_LEN???????????8 +>> > +#define PECI_GET_DIB_CMD 0xf7 +>> > +#define PECI_GET_DIB_WR_LEN 1 +>> > +#define PECI_GET_DIB_RD_LEN 8 >> > + ->> > +#define PECI_RDPKGCFG_CMD??????????????0xa1 ->> > +#define? PECI_RDPKGCFG_WRITE_LEN???????5 ->> > +#define? PECI_RDPKGCFG_READ_LEN_BASE???1 ->> > +#define PECI_WRPKGCFG_CMD??????????????0xa5 ->> > +#define? PECI_WRPKGCFG_WRITE_LEN_BASE??6 ->> > +#define? PECI_WRPKGCFG_READ_LEN????????????????1 +>> > +#define PECI_RDPKGCFG_CMD 0xa1 +>> > +#define PECI_RDPKGCFG_WRITE_LEN 5 +>> > +#define PECI_RDPKGCFG_READ_LEN_BASE 1 +>> > +#define PECI_WRPKGCFG_CMD 0xa5 +>> > +#define PECI_WRPKGCFG_WRITE_LEN_BASE 6 +>> > +#define PECI_WRPKGCFG_READ_LEN 1 >> > + >> > +/* Device Specific Completion Code (CC) Definition */ ->> > +#define PECI_CC_SUCCESS????????????????????????????????0x40 ->> > +#define PECI_CC_NEED_RETRY?????????????????????0x80 ->> > +#define PECI_CC_OUT_OF_RESOURCE????????????????????????0x81 ->> > +#define PECI_CC_UNAVAIL_RESOURCE???????????????0x82 ->> > +#define PECI_CC_INVALID_REQ????????????????????0x90 ->> > +#define PECI_CC_MCA_ERROR??????????????????????0x91 ->> > +#define PECI_CC_CATASTROPHIC_MCA_ERROR?????????0x93 ->> > +#define PECI_CC_FATAL_MCA_ERROR????????????????????????0x94 ->> > +#define PECI_CC_PARITY_ERR_GPSB_OR_PMSB????????????????0x98 ->> > +#define PECI_CC_PARITY_ERR_GPSB_OR_PMSB_IERR???0x9B ->> > +#define PECI_CC_PARITY_ERR_GPSB_OR_PMSB_MCA????0x9C ->> > + ->> > +#define PECI_RETRY_BIT?????????????????BIT(0) ->> > + ->> > +#define PECI_RETRY_TIMEOUT?????????????msecs_to_jiffies(700) ->> > +#define PECI_RETRY_INTERVAL_MIN????????????????msecs_to_jiffies(1) ->> > +#define PECI_RETRY_INTERVAL_MAX????????????????msecs_to_jiffies(128) +>> > +#define PECI_CC_SUCCESS 0x40 +>> > +#define PECI_CC_NEED_RETRY 0x80 +>> > +#define PECI_CC_OUT_OF_RESOURCE 0x81 +>> > +#define PECI_CC_UNAVAIL_RESOURCE 0x82 +>> > +#define PECI_CC_INVALID_REQ 0x90 +>> > +#define PECI_CC_MCA_ERROR 0x91 +>> > +#define PECI_CC_CATASTROPHIC_MCA_ERROR 0x93 +>> > +#define PECI_CC_FATAL_MCA_ERROR 0x94 +>> > +#define PECI_CC_PARITY_ERR_GPSB_OR_PMSB 0x98 +>> > +#define PECI_CC_PARITY_ERR_GPSB_OR_PMSB_IERR 0x9B +>> > +#define PECI_CC_PARITY_ERR_GPSB_OR_PMSB_MCA 0x9C +>> > + +>> > +#define PECI_RETRY_BIT BIT(0) +>> > + +>> > +#define PECI_RETRY_TIMEOUT msecs_to_jiffies(700) +>> > +#define PECI_RETRY_INTERVAL_MIN msecs_to_jiffies(1) +>> > +#define PECI_RETRY_INTERVAL_MAX msecs_to_jiffies(128) >> > + >> > +static u8 peci_request_data_cc(struct peci_request *req) >> > +{ ->> > +???????return req->rx.buf[0]; +>> > + return req->rx.buf[0]; >> > +} >> > + >> > +/** @@ -461,175 +461,175 @@ written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >> > + */ >> > +int peci_request_status(struct peci_request *req) >> > +{ ->> > +???????u8 cc = peci_request_data_cc(req); ->> > + ->> > +???????if (cc != PECI_CC_SUCCESS) ->> > +???????????????dev_dbg(&req->device->dev, "ret: %#02x\n", cc); ->> > + ->> > +???????switch (cc) { ->> > +???????case PECI_CC_SUCCESS: ->> > +???????????????return 0; ->> > +???????case PECI_CC_NEED_RETRY: ->> > +???????case PECI_CC_OUT_OF_RESOURCE: ->> > +???????case PECI_CC_UNAVAIL_RESOURCE: ->> > +???????????????return -EAGAIN; ->> > +???????case PECI_CC_INVALID_REQ: ->> > +???????????????return -EINVAL; ->> > +???????case PECI_CC_MCA_ERROR: ->> > +???????case PECI_CC_CATASTROPHIC_MCA_ERROR: ->> > +???????case PECI_CC_FATAL_MCA_ERROR: ->> > +???????case PECI_CC_PARITY_ERR_GPSB_OR_PMSB: ->> > +???????case PECI_CC_PARITY_ERR_GPSB_OR_PMSB_IERR: ->> > +???????case PECI_CC_PARITY_ERR_GPSB_OR_PMSB_MCA: ->> > +???????????????return -EIO; ->> > +???????} ->> > + ->> > +???????WARN_ONCE(1, "Unknown PECI completion code: %#02x\n", cc); ->> > + ->> > +???????return -EIO; +>> > + u8 cc = peci_request_data_cc(req); +>> > + +>> > + if (cc != PECI_CC_SUCCESS) +>> > + dev_dbg(&req->device->dev, "ret: %#02x\n", cc); +>> > + +>> > + switch (cc) { +>> > + case PECI_CC_SUCCESS: +>> > + return 0; +>> > + case PECI_CC_NEED_RETRY: +>> > + case PECI_CC_OUT_OF_RESOURCE: +>> > + case PECI_CC_UNAVAIL_RESOURCE: +>> > + return -EAGAIN; +>> > + case PECI_CC_INVALID_REQ: +>> > + return -EINVAL; +>> > + case PECI_CC_MCA_ERROR: +>> > + case PECI_CC_CATASTROPHIC_MCA_ERROR: +>> > + case PECI_CC_FATAL_MCA_ERROR: +>> > + case PECI_CC_PARITY_ERR_GPSB_OR_PMSB: +>> > + case PECI_CC_PARITY_ERR_GPSB_OR_PMSB_IERR: +>> > + case PECI_CC_PARITY_ERR_GPSB_OR_PMSB_MCA: +>> > + return -EIO; +>> > + } +>> > + +>> > + WARN_ONCE(1, "Unknown PECI completion code: %#02x\n", cc); +>> > + +>> > + return -EIO; >> > +} >> > +EXPORT_SYMBOL_NS_GPL(peci_request_status, PECI); >> > + >> > +static int peci_request_xfer(struct peci_request *req) >> > +{ ->> > +???????struct peci_device *device = req->device; ->> > +???????struct peci_controller *controller = device->controller; ->> > +???????int ret; +>> > + struct peci_device *device = req->device; +>> > + struct peci_controller *controller = device->controller; +>> > + int ret; >> > + ->> > +???????mutex_lock(&controller->bus_lock); ->> > +???????ret = controller->xfer(controller, device->addr, req); ->> > +???????mutex_unlock(&controller->bus_lock); +>> > + mutex_lock(&controller->bus_lock); +>> > + ret = controller->xfer(controller, device->addr, req); +>> > + mutex_unlock(&controller->bus_lock); >> > + ->> > +???????return ret; +>> > + return ret; >> > +} >> > + >> > +static int peci_request_xfer_retry(struct peci_request *req) >> > +{ ->> > +???????long wait_interval = PECI_RETRY_INTERVAL_MIN; ->> > +???????struct peci_device *device = req->device; ->> > +???????struct peci_controller *controller = device->controller; ->> > +???????unsigned long start = jiffies; ->> > +???????int ret; ->> > + ->> > +???????/* Don't try to use it for ping */ ->> > +???????if (WARN_ON(!req->rx.buf)) ->> > +???????????????return 0; ->> > + ->> > +???????do { ->> > +???????????????ret = peci_request_xfer(req); ->> > +???????????????if (ret) { ->> > +???????????????????????dev_dbg(&controller->dev, "xfer error: %d\n", ret); ->> > +???????????????????????return ret; ->> > +???????????????} ->> > + ->> > +???????????????if (peci_request_status(req) != -EAGAIN) ->> > +???????????????????????return 0; ->> > + ->> > +???????????????/* Set the retry bit to indicate a retry attempt */ ->> > +???????????????req->tx.buf[1] |= PECI_RETRY_BIT; ->> > + ->> > +???????????????if (schedule_timeout_interruptible(wait_interval)) ->> > +???????????????????????return -ERESTARTSYS; ->> > + ->> > +???????????????wait_interval *= 2; ->> > +???????????????if (wait_interval > PECI_RETRY_INTERVAL_MAX) ->> > +???????????????????????wait_interval = PECI_RETRY_INTERVAL_MAX; +>> > + long wait_interval = PECI_RETRY_INTERVAL_MIN; +>> > + struct peci_device *device = req->device; +>> > + struct peci_controller *controller = device->controller; +>> > + unsigned long start = jiffies; +>> > + int ret; +>> > + +>> > + /* Don't try to use it for ping */ +>> > + if (WARN_ON(!req->rx.buf)) +>> > + return 0; +>> > + +>> > + do { +>> > + ret = peci_request_xfer(req); +>> > + if (ret) { +>> > + dev_dbg(&controller->dev, "xfer error: %d\n", ret); +>> > + return ret; +>> > + } +>> > + +>> > + if (peci_request_status(req) != -EAGAIN) +>> > + return 0; +>> > + +>> > + /* Set the retry bit to indicate a retry attempt */ +>> > + req->tx.buf[1] |= PECI_RETRY_BIT; +>> > + +>> > + if (schedule_timeout_interruptible(wait_interval)) +>> > + return -ERESTARTSYS; +>> > + +>> > + wait_interval *= 2; +>> > + if (wait_interval > PECI_RETRY_INTERVAL_MAX) +>> > + wait_interval = PECI_RETRY_INTERVAL_MAX; >> >> wait_interval = min(wait_interval * 2, PECI_RETRY_INTERVAL_MAX) ? > >Ack. > >> ->> > +???????} while (time_before(jiffies, start + PECI_RETRY_TIMEOUT)); +>> > + } while (time_before(jiffies, start + PECI_RETRY_TIMEOUT)); >> > + ->> > +???????dev_dbg(&controller->dev, "request timed out\n"); +>> > + dev_dbg(&controller->dev, "request timed out\n"); >> > + ->> > +???????return -ETIMEDOUT; +>> > + return -ETIMEDOUT; >> > +} >> > + >> > /** ->> > ?* peci_request_alloc() - allocate &struct peci_request with buffers with +>> > * peci_request_alloc() - allocate &struct peci_request with buffers with >> > given lengths ->> > ?* @device: PECI device to which request is going to be sent +>> > * @device: PECI device to which request is going to be sent >> > @@ -72,3 +201,91 @@ void peci_request_free(struct peci_request *req) ->> > ????????kfree(req); +>> > kfree(req); >> > } >> > EXPORT_SYMBOL_NS_GPL(peci_request_free, PECI); >> > + >> > +struct peci_request *peci_get_dib(struct peci_device *device) >> > +{ ->> > +???????struct peci_request *req; ->> > +???????int ret; +>> > + struct peci_request *req; +>> > + int ret; >> > + ->> > +???????req = peci_request_alloc(device, PECI_GET_DIB_WR_LEN, +>> > + req = peci_request_alloc(device, PECI_GET_DIB_WR_LEN, >> > PECI_GET_DIB_RD_LEN); ->> > +???????if (!req) ->> > +???????????????return ERR_PTR(-ENOMEM); +>> > + if (!req) +>> > + return ERR_PTR(-ENOMEM); >> > + ->> > +???????req->tx.buf[0] = PECI_GET_DIB_CMD; +>> > + req->tx.buf[0] = PECI_GET_DIB_CMD; >> > + ->> > +???????ret = peci_request_xfer(req); ->> > +???????if (ret) { ->> > +???????????????peci_request_free(req); ->> > +???????????????return ERR_PTR(ret); ->> > +???????} +>> > + ret = peci_request_xfer(req); +>> > + if (ret) { +>> > + peci_request_free(req); +>> > + return ERR_PTR(ret); +>> > + } >> > + ->> > +???????return req; +>> > + return req; >> > +} >> > +EXPORT_SYMBOL_NS_GPL(peci_get_dib, PECI); >> > + >> > +static struct peci_request * >> > +__pkg_cfg_read(struct peci_device *device, u8 index, u16 param, u8 len) >> > +{ ->> > +???????struct peci_request *req; ->> > +???????int ret; ->> > + ->> > +???????req = peci_request_alloc(device, PECI_RDPKGCFG_WRITE_LEN, ->> > +??????????????????????????????? PECI_RDPKGCFG_READ_LEN_BASE + len); ->> > +???????if (!req) ->> > +???????????????return ERR_PTR(-ENOMEM); ->> > + ->> > +???????req->tx.buf[0] = PECI_RDPKGCFG_CMD; ->> > +???????req->tx.buf[1] = 0; ->> > +???????req->tx.buf[2] = index; ->> > +???????put_unaligned_le16(param, &req->tx.buf[3]); ->> > + ->> > +???????ret = peci_request_xfer_retry(req); ->> > +???????if (ret) { ->> > +???????????????peci_request_free(req); ->> > +???????????????return ERR_PTR(ret); ->> > +???????} ->> > + ->> > +???????return req; +>> > + struct peci_request *req; +>> > + int ret; +>> > + +>> > + req = peci_request_alloc(device, PECI_RDPKGCFG_WRITE_LEN, +>> > + PECI_RDPKGCFG_READ_LEN_BASE + len); +>> > + if (!req) +>> > + return ERR_PTR(-ENOMEM); +>> > + +>> > + req->tx.buf[0] = PECI_RDPKGCFG_CMD; +>> > + req->tx.buf[1] = 0; +>> > + req->tx.buf[2] = index; +>> > + put_unaligned_le16(param, &req->tx.buf[3]); +>> > + +>> > + ret = peci_request_xfer_retry(req); +>> > + if (ret) { +>> > + peci_request_free(req); +>> > + return ERR_PTR(ret); +>> > + } +>> > + +>> > + return req; >> > +} >> > + >> > +u8 peci_request_data_readb(struct peci_request *req) >> > +{ ->> > +???????return req->rx.buf[1]; +>> > + return req->rx.buf[1]; >> > +} >> > +EXPORT_SYMBOL_NS_GPL(peci_request_data_readb, PECI); >> > + >> > +u16 peci_request_data_readw(struct peci_request *req) >> > +{ ->> > +???????return get_unaligned_le16(&req->rx.buf[1]); +>> > + return get_unaligned_le16(&req->rx.buf[1]); >> > +} >> > +EXPORT_SYMBOL_NS_GPL(peci_request_data_readw, PECI); >> > + >> > +u32 peci_request_data_readl(struct peci_request *req) >> > +{ ->> > +???????return get_unaligned_le32(&req->rx.buf[1]); +>> > + return get_unaligned_le32(&req->rx.buf[1]); >> > +} >> > +EXPORT_SYMBOL_NS_GPL(peci_request_data_readl, PECI); >> > + >> > +u64 peci_request_data_readq(struct peci_request *req) >> > +{ ->> > +???????return get_unaligned_le64(&req->rx.buf[1]); +>> > + return get_unaligned_le64(&req->rx.buf[1]); >> > +} >> > +EXPORT_SYMBOL_NS_GPL(peci_request_data_readq, PECI); >> > + >> > +u64 peci_request_data_dib(struct peci_request *req) >> > +{ ->> > +???????return get_unaligned_le64(&req->rx.buf[0]); +>> > + return get_unaligned_le64(&req->rx.buf[0]); >> > +} >> > +EXPORT_SYMBOL_NS_GPL(peci_request_data_dib, PECI); >> > + @@ -637,10 +637,10 @@ written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >> > +struct peci_request *peci_pkg_cfg_##x(struct peci_device *device, u8 index, >> > u16 param) \ >> > +{ \ ->> > +???????return __pkg_cfg_read(device, index, param, sizeof(type)); \ +>> > + return __pkg_cfg_read(device, index, param, sizeof(type)); \ >> > +} \ >> ->> Is there a reason for this particular API?? I'd think a more natural one +>> Is there a reason for this particular API? I'd think a more natural one >> that would offload a bit of boilerplate from callers would look more like >> >> int peci_pkg_cfg_##x(struct peci_device *device, u8 index, u16 param, type @@ -672,42 +672,42 @@ written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >> > #include <linux/mutex.h> >> > #include <linux/types.h> >> > ->> > +#define PECI_PCS_PKG_ID????????????????????????0? /* Package Identifier +>> > +#define PECI_PCS_PKG_ID 0 /* Package Identifier >> > Read */ ->> > +#define? PECI_PKG_ID_CPU_ID????????????0x0000? /* CPUID Info */ ->> > +#define? PECI_PKG_ID_PLATFORM_ID???????0x0001? /* Platform ID */ ->> > +#define? PECI_PKG_ID_DEVICE_ID?????????0x0002? /* Uncore Device ID */ ->> > +#define? PECI_PKG_ID_MAX_THREAD_ID?????0x0003? /* Max Thread ID */ ->> > +#define? PECI_PKG_ID_MICROCODE_REV?????0x0004? /* CPU Microcode Update +>> > +#define PECI_PKG_ID_CPU_ID 0x0000 /* CPUID Info */ +>> > +#define PECI_PKG_ID_PLATFORM_ID 0x0001 /* Platform ID */ +>> > +#define PECI_PKG_ID_DEVICE_ID 0x0002 /* Uncore Device ID */ +>> > +#define PECI_PKG_ID_MAX_THREAD_ID 0x0003 /* Max Thread ID */ +>> > +#define PECI_PKG_ID_MICROCODE_REV 0x0004 /* CPU Microcode Update >> > Revision */ ->> > +#define? PECI_PKG_ID_MCA_ERROR_LOG?????0x0005? /* Machine Check Status */ +>> > +#define PECI_PKG_ID_MCA_ERROR_LOG 0x0005 /* Machine Check Status */ >> > + >> > struct peci_request; >> > >> > /** >> > @@ -41,6 +49,11 @@ static inline struct peci_controller >> > *to_peci_controller(void *d) ->> > ?* struct peci_device - PECI device ->> > ?* @dev: device object to register PECI device to the device model ->> > ?* @controller: manages the bus segment hosting this PECI device +>> > * struct peci_device - PECI device +>> > * @dev: device object to register PECI device to the device model +>> > * @controller: manages the bus segment hosting this PECI device >> > + * @info: PECI device characteristics >> > + * @info.family: device family >> > + * @info.model: device model >> > + * @info.peci_revision: PECI revision supported by the PECI device >> > + * @info.socket_id: the socket ID represented by the PECI device ->> > ?* @addr: address used on the PECI bus connected to the parent controller ->> > ?* ->> > ?* A peci_device identifies a single device (i.e. CPU) connected to a PECI +>> > * @addr: address used on the PECI bus connected to the parent controller +>> > * +>> > * A peci_device identifies a single device (i.e. CPU) connected to a PECI >> > bus. >> > @@ -50,6 +63,12 @@ static inline struct peci_controller >> > *to_peci_controller(void *d) >> > struct peci_device { ->> > ????????struct device dev; ->> > ????????struct peci_controller *controller; ->> > +???????struct { ->> > +???????????????u16 family; ->> > +???????????????u8 model; ->> > +???????????????u8 peci_revision; +>> > struct device dev; +>> > struct peci_controller *controller; +>> > + struct { +>> > + u16 family; +>> > + u8 model; +>> > + u8 peci_revision; >> >> This field gets set but doesn't seem to end up used anywhere; is it >> useful? @@ -722,9 +722,9 @@ written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >-Iwona > >> ->> > +???????????????u8 socket_id; ->> > +???????} info; ->> > ????????u8 addr; +>> > + u8 socket_id; +>> > + } info; +>> > u8 addr; >> > }; >> > >> > diff --git a/lib/Kconfig b/lib/Kconfig @@ -734,10 +734,14 @@ written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case. >> > @@ -721,5 +721,5 @@ config ASN1_ENCODER >> > >> > config GENERIC_LIB_X86 ->> > ????????bool ->> > -???????depends on X86 ->> > +???????depends on X86 || PECI ->> > ????????default n +>> > bool +>> > - depends on X86 +>> > + depends on X86 || PECI +>> > default n >> > -- >> > 2.31.1 > +_______________________________________________ +linux-arm-kernel mailing list +linux-arm-kernel@lists.infradead.org +http://lists.infradead.org/mailman/listinfo/linux-arm-kernel diff --git a/a/content_digest b/N3/content_digest index 315ee2f..5e1d746 100644 --- a/a/content_digest +++ b/N3/content_digest @@ -3,9 +3,36 @@ "ref\020210727201028.GS8018@packtop\0" "ref\079f5b6ed4942ddeb66beea03907a58495376ccef.camel@intel.com\0" "From\0Zev Weiss <zweiss@equinix.com>\0" - "Subject\0[PATCH 09/14] peci: Add support for PECI device drivers\0" + "Subject\0Re: [PATCH 09/14] peci: Add support for PECI device drivers\0" "Date\0Thu, 29 Jul 2021 23:22:06 +0000\0" - "To\0linux-aspeed@lists.ozlabs.org\0" + "To\0Winiarska" + " Iwona <iwona.winiarska@intel.com>\0" + "Cc\0corbet@lwn.net <corbet@lwn.net>" + jae.hyun.yoo@linux.intel.com <jae.hyun.yoo@linux.intel.com> + Lutomirski + Andy <luto@kernel.org> + linux-hwmon@vger.kernel.org <linux-hwmon@vger.kernel.org> + Luck + Tony <tony.luck@intel.com> + andrew@aj.id.au <andrew@aj.id.au> + mchehab@kernel.org <mchehab@kernel.org> + jdelvare@suse.com <jdelvare@suse.com> + linux-kernel@vger.kernel.org <linux-kernel@vger.kernel.org> + mingo@redhat.com <mingo@redhat.com> + devicetree@vger.kernel.org <devicetree@vger.kernel.org> + tglx@linutronix.de <tglx@linutronix.de> + linux@roeck-us.net <linux@roeck-us.net> + linux-aspeed@lists.ozlabs.org <linux-aspeed@lists.ozlabs.org> + linux-doc@vger.kernel.org <linux-doc@vger.kernel.org> + yazen.ghannam@amd.com <yazen.ghannam@amd.com> + robh+dt@kernel.org <robh+dt@kernel.org> + openbmc@lists.ozlabs.org <openbmc@lists.ozlabs.org> + bp@alien8.de <bp@alien8.de> + linux-arm-kernel@lists.infradead.org <linux-arm-kernel@lists.infradead.org> + pierre-louis.bossart@linux.intel.com <pierre-louis.bossart@linux.intel.com> + andriy.shevchenko@linux.intel.com <andriy.shevchenko@linux.intel.com> + x86@kernel.org <x86@kernel.org> + " gregkh@linuxfoundation.org <gregkh@linuxfoundation.org>\0" "\00:1\0" "b\0" "On Thu, Jul 29, 2021 at 04:17:06PM CDT, Winiarska, Iwona wrote:\n" @@ -22,13 +49,13 @@ ">> > Signed-off-by: Iwona Winiarska <iwona.winiarska@intel.com>\n" ">> > Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>\n" ">> > ---\n" - ">> > drivers/peci/Kconfig??? |?? 1 +\n" - ">> > drivers/peci/core.c???? |? 49 +++++++++\n" - ">> > drivers/peci/device.c?? |? 99 ++++++++++++++++++\n" - ">> > drivers/peci/internal.h |? 75 ++++++++++++++\n" - ">> > drivers/peci/request.c? | 217 ++++++++++++++++++++++++++++++++++++++++\n" - ">> > include/linux/peci.h??? |? 19 ++++\n" - ">> > lib/Kconfig???????????? |?? 2 +-\n" + ">> > drivers/peci/Kconfig\302\240\302\240\302\240 |\302\240\302\240 1 +\n" + ">> > drivers/peci/core.c\302\240\302\240\302\240\302\240 |\302\240 49 +++++++++\n" + ">> > drivers/peci/device.c\302\240\302\240 |\302\240 99 ++++++++++++++++++\n" + ">> > drivers/peci/internal.h |\302\240 75 ++++++++++++++\n" + ">> > drivers/peci/request.c\302\240 | 217 ++++++++++++++++++++++++++++++++++++++++\n" + ">> > include/linux/peci.h\302\240\302\240\302\240 |\302\240 19 ++++\n" + ">> > lib/Kconfig\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 |\302\240\302\240 2 +-\n" ">> > 7 files changed, 461 insertions(+), 1 deletion(-)\n" ">> >\n" ">> > diff --git a/drivers/peci/Kconfig b/drivers/peci/Kconfig\n" @@ -38,11 +65,11 @@ ">> > @@ -2,6 +2,7 @@\n" ">> >\n" ">> > menuconfig PECI\n" - ">> > ????????tristate \"PECI support\"\n" - ">> > +???????select GENERIC_LIB_X86\n" - ">> > ????????help\n" - ">> > ????????? The Platform Environment Control Interface (PECI) is an interface\n" - ">> > ????????? that provides a communication channel to Intel processors and\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240tristate \"PECI support\"\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240select GENERIC_LIB_X86\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240help\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 The Platform Environment Control Interface (PECI) is an interface\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 that provides a communication channel to Intel processors and\n" ">> > diff --git a/drivers/peci/core.c b/drivers/peci/core.c\n" ">> > index ae7a9572cdf3..94426b7f2618 100644\n" ">> > --- a/drivers/peci/core.c\n" @@ -56,57 +83,57 @@ ">> > +peci_bus_match_device_id(const struct peci_device_id *id, struct\n" ">> > peci_device *device)\n" ">> > +{\n" - ">> > +???????while (id->family != 0) {\n" - ">> > +???????????????if (id->family == device->info.family &&\n" - ">> > +?????????????????? id->model == device->info.model)\n" - ">> > +???????????????????????return id;\n" - ">> > +???????????????id++;\n" - ">> > +???????}\n" - ">> > +\n" - ">> > +???????return NULL;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240while (id->family != 0) {\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (id->family == device->info.family &&\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 id->model == device->info.model)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return id;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240id++;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240}\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return NULL;\n" ">> > +}\n" ">> > +\n" ">> > +static int peci_bus_device_match(struct device *dev, struct device_driver\n" ">> > *drv)\n" ">> > +{\n" - ">> > +???????struct peci_device *device = to_peci_device(dev);\n" - ">> > +???????struct peci_driver *peci_drv = to_peci_driver(drv);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_device *device = to_peci_device(dev);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_driver *peci_drv = to_peci_driver(drv);\n" ">> > +\n" - ">> > +???????if (dev->type != &peci_device_type)\n" - ">> > +???????????????return 0;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (dev->type != &peci_device_type)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return 0;\n" ">> > +\n" - ">> > +???????if (peci_bus_match_device_id(peci_drv->id_table, device))\n" - ">> > +???????????????return 1;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (peci_bus_match_device_id(peci_drv->id_table, device))\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return 1;\n" ">> > +\n" - ">> > +???????return 0;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return 0;\n" ">> > +}\n" ">> > +\n" ">> > +static int peci_bus_device_probe(struct device *dev)\n" ">> > +{\n" - ">> > +???????struct peci_device *device = to_peci_device(dev);\n" - ">> > +???????struct peci_driver *driver = to_peci_driver(dev->driver);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_device *device = to_peci_device(dev);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_driver *driver = to_peci_driver(dev->driver);\n" ">> > +\n" - ">> > +???????return driver->probe(device, peci_bus_match_device_id(driver-\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return driver->probe(device, peci_bus_match_device_id(driver-\n" ">> > >id_table, device));\n" ">> > +}\n" ">> > +\n" ">> > +static int peci_bus_device_remove(struct device *dev)\n" ">> > +{\n" - ">> > +???????struct peci_device *device = to_peci_device(dev);\n" - ">> > +???????struct peci_driver *driver = to_peci_driver(dev->driver);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_device *device = to_peci_device(dev);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_driver *driver = to_peci_driver(dev->driver);\n" ">> > +\n" - ">> > +???????if (driver->remove)\n" - ">> > +???????????????driver->remove(device);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (driver->remove)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240driver->remove(device);\n" ">> > +\n" - ">> > +???????return 0;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return 0;\n" ">> > +}\n" ">> > +\n" ">> > struct bus_type peci_bus_type = {\n" - ">> > ????????.name???????????= \"peci\",\n" - ">> > +???????.match??????????= peci_bus_device_match,\n" - ">> > +???????.probe??????????= peci_bus_device_probe,\n" - ">> > +???????.remove?????????= peci_bus_device_remove,\n" - ">> > ????????.bus_groups?????= peci_bus_groups,\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240.name\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240= \"peci\",\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240.match\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240= peci_bus_device_match,\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240.probe\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240= peci_bus_device_probe,\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240.remove\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240= peci_bus_device_remove,\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240.bus_groups\302\240\302\240\302\240\302\240\302\240= peci_bus_groups,\n" ">> > };\n" ">> >\n" ">> > diff --git a/drivers/peci/device.c b/drivers/peci/device.c\n" @@ -127,19 +154,19 @@ ">> > +#define REVISION_NUM_MASK GENMASK(15, 8)\n" ">> > +static int peci_get_revision(struct peci_device *device, u8 *revision)\n" ">> > +{\n" - ">> > +???????struct peci_request *req;\n" - ">> > +???????u64 dib;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_request *req;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u64 dib;\n" ">> > +\n" - ">> > +???????req = peci_get_dib(device);\n" - ">> > +???????if (IS_ERR(req))\n" - ">> > +???????????????return PTR_ERR(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240req = peci_get_dib(device);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (IS_ERR(req))\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return PTR_ERR(req);\n" ">> > +\n" - ">> > +???????dib = peci_request_data_dib(req);\n" - ">> > +???????if (dib == 0) {\n" - ">> > +???????????????peci_request_free(req);\n" - ">> > +???????????????return -EIO;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240dib = peci_request_data_dib(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (dib == 0) {\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240peci_request_free(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return -EIO;\n" ">>\n" - ">> Any particular reason to check for zero specifically here?? It looks\n" + ">> Any particular reason to check for zero specifically here?\302\240 It looks\n" ">> like that would be a case where the host CPU responds and everything's\n" ">> otherwise fine, but the host just happened to send back a bunch of zeros\n" ">> for whatever reason -- which may not be a valid PECI revision number,\n" @@ -179,30 +206,30 @@ "written as !memchr_inv(req->rx.buf, 0, 8) in the non-u64 case.\n" "\n" ">>\n" - ">> > +???????}\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240}\n" ">> > +\n" - ">> > +???????*revision = FIELD_GET(REVISION_NUM_MASK, dib);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240*revision = FIELD_GET(REVISION_NUM_MASK, dib);\n" ">> > +\n" - ">> > +???????peci_request_free(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240peci_request_free(req);\n" ">> > +\n" - ">> > +???????return 0;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return 0;\n" ">> > +}\n" ">> > +\n" ">> > +static int peci_get_cpu_id(struct peci_device *device, u32 *cpu_id)\n" ">> > +{\n" - ">> > +???????struct peci_request *req;\n" - ">> > +???????int ret;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_request *req;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240int ret;\n" ">> > +\n" - ">> > +???????req = peci_pkg_cfg_readl(device, PECI_PCS_PKG_ID,\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240req = peci_pkg_cfg_readl(device, PECI_PCS_PKG_ID,\n" ">> > PECI_PKG_ID_CPU_ID);\n" - ">> > +???????if (IS_ERR(req))\n" - ">> > +???????????????return PTR_ERR(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (IS_ERR(req))\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return PTR_ERR(req);\n" ">> > +\n" - ">> > +???????ret = peci_request_status(req);\n" - ">> > +???????if (ret)\n" - ">> > +???????????????goto out_req_free;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = peci_request_status(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240goto out_req_free;\n" ">> > +\n" - ">> > +???????*cpu_id = peci_request_data_readl(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240*cpu_id = peci_request_data_readl(req);\n" ">> > +out_req_free:\n" ">>\n" ">> As suggested on patch #8, I think it might be cleaner to stack-allocate\n" @@ -210,8 +237,8 @@ ">> calls in functions like this and hence might simplify it away entirely,\n" ">> but if this does remain like this we could just do\n" ">>\n" - ">> ????????if (!ret)\n" - ">> ????????????????*cpu_id = peci_request_data_readl(req);\n" + ">> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (!ret)\n" + ">> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240*cpu_id = peci_request_data_readl(req);\n" ">>\n" ">> instead of using a goto to skip a single line.\n" ">\n" @@ -221,87 +248,87 @@ ">case of peci requests.\n" ">\n" ">>\n" - ">> > +???????peci_request_free(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240peci_request_free(req);\n" ">> > +\n" - ">> > +???????return ret;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ret;\n" ">> > +}\n" ">> > +\n" ">> > +static int peci_device_info_init(struct peci_device *device)\n" ">> > +{\n" - ">> > +???????u8 revision;\n" - ">> > +???????u32 cpu_id;\n" - ">> > +???????int ret;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u8 revision;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u32 cpu_id;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240int ret;\n" ">> > +\n" - ">> > +???????ret = peci_get_cpu_id(device, &cpu_id);\n" - ">> > +???????if (ret)\n" - ">> > +???????????????return ret;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = peci_get_cpu_id(device, &cpu_id);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ret;\n" ">> > +\n" - ">> > +???????device->info.family = x86_family(cpu_id);\n" - ">> > +???????device->info.model = x86_model(cpu_id);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240device->info.family = x86_family(cpu_id);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240device->info.model = x86_model(cpu_id);\n" ">> > +\n" - ">> > +???????ret = peci_get_revision(device, &revision);\n" - ">> > +???????if (ret)\n" - ">> > +???????????????return ret;\n" - ">> > +???????device->info.peci_revision = revision;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = peci_get_revision(device, &revision);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ret;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240device->info.peci_revision = revision;\n" ">> > +\n" - ">> > +???????device->info.socket_id = device->addr - PECI_BASE_ADDR;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240device->info.socket_id = device->addr - PECI_BASE_ADDR;\n" ">> > +\n" - ">> > +???????return 0;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return 0;\n" ">> > +}\n" ">> > +\n" ">> > static int peci_detect(struct peci_controller *controller, u8 addr)\n" ">> > {\n" - ">> > ????????struct peci_request *req;\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_request *req;\n" ">> > @@ -75,6 +143,10 @@ int peci_device_create(struct peci_controller\n" ">> > *controller, u8 addr)\n" - ">> > ????????device->dev.bus = &peci_bus_type;\n" - ">> > ????????device->dev.type = &peci_device_type;\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240device->dev.bus = &peci_bus_type;\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240device->dev.type = &peci_device_type;\n" ">> >\n" - ">> > +???????ret = peci_device_info_init(device);\n" - ">> > +???????if (ret)\n" - ">> > +???????????????goto err_free;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = peci_device_info_init(device);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240goto err_free;\n" ">> > +\n" - ">> > ????????ret = dev_set_name(&device->dev, \"%d-%02x\", controller->id, device-\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = dev_set_name(&device->dev, \"%d-%02x\", controller->id, device-\n" ">> > >addr);\n" - ">> > ????????if (ret)\n" - ">> > ????????????????goto err_free;\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret)\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240goto err_free;\n" ">> > @@ -98,6 +170,33 @@ void peci_device_destroy(struct peci_device *device)\n" - ">> > ????????device_unregister(&device->dev);\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240device_unregister(&device->dev);\n" ">> > }\n" ">> >\n" ">> > +int __peci_driver_register(struct peci_driver *driver, struct module\n" ">> > *owner,\n" - ">> > +????????????????????????? const char *mod_name)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 const char *mod_name)\n" ">> > +{\n" - ">> > +???????driver->driver.bus = &peci_bus_type;\n" - ">> > +???????driver->driver.owner = owner;\n" - ">> > +???????driver->driver.mod_name = mod_name;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240driver->driver.bus = &peci_bus_type;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240driver->driver.owner = owner;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240driver->driver.mod_name = mod_name;\n" ">> > +\n" - ">> > +???????if (!driver->probe) {\n" - ">> > +???????????????pr_err(\"peci: trying to register driver without probe\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (!driver->probe) {\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240pr_err(\"peci: trying to register driver without probe\n" ">> > callback\\n\");\n" - ">> > +???????????????return -EINVAL;\n" - ">> > +???????}\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return -EINVAL;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240}\n" ">> > +\n" - ">> > +???????if (!driver->id_table) {\n" - ">> > +???????????????pr_err(\"peci: trying to register driver without device id\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (!driver->id_table) {\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240pr_err(\"peci: trying to register driver without device id\n" ">> > table\\n\");\n" - ">> > +???????????????return -EINVAL;\n" - ">> > +???????}\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return -EINVAL;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240}\n" ">> > +\n" - ">> > +???????return driver_register(&driver->driver);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return driver_register(&driver->driver);\n" ">> > +}\n" ">> > +EXPORT_SYMBOL_NS_GPL(__peci_driver_register, PECI);\n" ">> > +\n" ">> > +void peci_driver_unregister(struct peci_driver *driver)\n" ">> > +{\n" - ">> > +???????driver_unregister(&driver->driver);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240driver_unregister(&driver->driver);\n" ">> > +}\n" ">> > +EXPORT_SYMBOL_NS_GPL(peci_driver_unregister, PECI);\n" ">> > +\n" ">> > static void peci_device_release(struct device *dev)\n" ">> > {\n" - ">> > ????????struct peci_device *device = to_peci_device(dev);\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_device *device = to_peci_device(dev);\n" ">> > diff --git a/drivers/peci/internal.h b/drivers/peci/internal.h\n" ">> > index 6b139adaf6b8..c891c93e077a 100644\n" ">> > --- a/drivers/peci/internal.h\n" @@ -338,9 +365,9 @@ ">> > + * @model: device model\n" ">> > + */\n" ">> > +struct peci_device_id {\n" - ">> > +???????const void *data;\n" - ">> > +???????u16 family;\n" - ">> > +???????u8 model;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240const void *data;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u16 family;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u8 model;\n" ">> > +};\n" ">> > +\n" ">> > extern struct device_type peci_device_type;\n" @@ -358,21 +385,21 @@ ">> > + * @id_table: PECI device match table to decide which device to bind\n" ">> > + */\n" ">> > +struct peci_driver {\n" - ">> > +???????struct device_driver driver;\n" - ">> > +???????int (*probe)(struct peci_device *device, const struct peci_device_id\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct device_driver driver;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240int (*probe)(struct peci_device *device, const struct peci_device_id\n" ">> > *id);\n" - ">> > +???????void (*remove)(struct peci_device *device);\n" - ">> > +???????const struct peci_device_id *id_table;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240void (*remove)(struct peci_device *device);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240const struct peci_device_id *id_table;\n" ">> > +};\n" ">> > +\n" ">> > +static inline struct peci_driver *to_peci_driver(struct device_driver *d)\n" ">> > +{\n" - ">> > +???????return container_of(d, struct peci_driver, driver);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return container_of(d, struct peci_driver, driver);\n" ">> > +}\n" ">> > +\n" ">> > +int __peci_driver_register(struct peci_driver *driver, struct module\n" ">> > *owner,\n" - ">> > +????????????????????????? const char *mod_name);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 const char *mod_name);\n" ">> > +/**\n" ">> > + * peci_driver_register() - register PECI driver\n" ">> > + * @driver: the driver to be registered\n" @@ -386,7 +413,7 @@ ">> > + * Return: zero on success, else a negative error code.\n" ">> > + */\n" ">> > +#define peci_driver_register(driver) \\\n" - ">> > +???????__peci_driver_register(driver, THIS_MODULE, KBUILD_MODNAME)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240__peci_driver_register(driver, THIS_MODULE, KBUILD_MODNAME)\n" ">> > +void peci_driver_unregister(struct peci_driver *driver);\n" ">> > +\n" ">> > +/**\n" @@ -400,7 +427,7 @@ ">> > module_exit()\n" ">> > + */\n" ">> > +#define module_peci_driver(__peci_driver) \\\n" - ">> > +???????module_driver(__peci_driver, peci_driver_register,\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240module_driver(__peci_driver, peci_driver_register,\n" ">> > peci_driver_unregister)\n" ">> > +\n" ">> > extern struct device_type peci_controller_type;\n" @@ -424,39 +451,39 @@ ">> > +\n" ">> > #include \"internal.h\"\n" ">> >\n" - ">> > +#define PECI_GET_DIB_CMD???????????????0xf7\n" - ">> > +#define? PECI_GET_DIB_WR_LEN???????????1\n" - ">> > +#define? PECI_GET_DIB_RD_LEN???????????8\n" + ">> > +#define PECI_GET_DIB_CMD\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400xf7\n" + ">> > +#define\302\240 PECI_GET_DIB_WR_LEN\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2401\n" + ">> > +#define\302\240 PECI_GET_DIB_RD_LEN\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2408\n" ">> > +\n" - ">> > +#define PECI_RDPKGCFG_CMD??????????????0xa1\n" - ">> > +#define? PECI_RDPKGCFG_WRITE_LEN???????5\n" - ">> > +#define? PECI_RDPKGCFG_READ_LEN_BASE???1\n" - ">> > +#define PECI_WRPKGCFG_CMD??????????????0xa5\n" - ">> > +#define? PECI_WRPKGCFG_WRITE_LEN_BASE??6\n" - ">> > +#define? PECI_WRPKGCFG_READ_LEN????????????????1\n" + ">> > +#define PECI_RDPKGCFG_CMD\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400xa1\n" + ">> > +#define\302\240 PECI_RDPKGCFG_WRITE_LEN\302\240\302\240\302\240\302\240\302\240\302\240\302\2405\n" + ">> > +#define\302\240 PECI_RDPKGCFG_READ_LEN_BASE\302\240\302\240\302\2401\n" + ">> > +#define PECI_WRPKGCFG_CMD\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400xa5\n" + ">> > +#define\302\240 PECI_WRPKGCFG_WRITE_LEN_BASE\302\240\302\2406\n" + ">> > +#define\302\240 PECI_WRPKGCFG_READ_LEN\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2401\n" ">> > +\n" ">> > +/* Device Specific Completion Code (CC) Definition */\n" - ">> > +#define PECI_CC_SUCCESS????????????????????????????????0x40\n" - ">> > +#define PECI_CC_NEED_RETRY?????????????????????0x80\n" - ">> > +#define PECI_CC_OUT_OF_RESOURCE????????????????????????0x81\n" - ">> > +#define PECI_CC_UNAVAIL_RESOURCE???????????????0x82\n" - ">> > +#define PECI_CC_INVALID_REQ????????????????????0x90\n" - ">> > +#define PECI_CC_MCA_ERROR??????????????????????0x91\n" - ">> > +#define PECI_CC_CATASTROPHIC_MCA_ERROR?????????0x93\n" - ">> > +#define PECI_CC_FATAL_MCA_ERROR????????????????????????0x94\n" - ">> > +#define PECI_CC_PARITY_ERR_GPSB_OR_PMSB????????????????0x98\n" - ">> > +#define PECI_CC_PARITY_ERR_GPSB_OR_PMSB_IERR???0x9B\n" - ">> > +#define PECI_CC_PARITY_ERR_GPSB_OR_PMSB_MCA????0x9C\n" - ">> > +\n" - ">> > +#define PECI_RETRY_BIT?????????????????BIT(0)\n" - ">> > +\n" - ">> > +#define PECI_RETRY_TIMEOUT?????????????msecs_to_jiffies(700)\n" - ">> > +#define PECI_RETRY_INTERVAL_MIN????????????????msecs_to_jiffies(1)\n" - ">> > +#define PECI_RETRY_INTERVAL_MAX????????????????msecs_to_jiffies(128)\n" + ">> > +#define PECI_CC_SUCCESS\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400x40\n" + ">> > +#define PECI_CC_NEED_RETRY\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400x80\n" + ">> > +#define PECI_CC_OUT_OF_RESOURCE\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400x81\n" + ">> > +#define PECI_CC_UNAVAIL_RESOURCE\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400x82\n" + ">> > +#define PECI_CC_INVALID_REQ\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400x90\n" + ">> > +#define PECI_CC_MCA_ERROR\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400x91\n" + ">> > +#define PECI_CC_CATASTROPHIC_MCA_ERROR\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400x93\n" + ">> > +#define PECI_CC_FATAL_MCA_ERROR\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400x94\n" + ">> > +#define PECI_CC_PARITY_ERR_GPSB_OR_PMSB\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400x98\n" + ">> > +#define PECI_CC_PARITY_ERR_GPSB_OR_PMSB_IERR\302\240\302\240\302\2400x9B\n" + ">> > +#define PECI_CC_PARITY_ERR_GPSB_OR_PMSB_MCA\302\240\302\240\302\240\302\2400x9C\n" + ">> > +\n" + ">> > +#define PECI_RETRY_BIT\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240BIT(0)\n" + ">> > +\n" + ">> > +#define PECI_RETRY_TIMEOUT\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240msecs_to_jiffies(700)\n" + ">> > +#define PECI_RETRY_INTERVAL_MIN\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240msecs_to_jiffies(1)\n" + ">> > +#define PECI_RETRY_INTERVAL_MAX\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240msecs_to_jiffies(128)\n" ">> > +\n" ">> > +static u8 peci_request_data_cc(struct peci_request *req)\n" ">> > +{\n" - ">> > +???????return req->rx.buf[0];\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return req->rx.buf[0];\n" ">> > +}\n" ">> > +\n" ">> > +/**\n" @@ -471,175 +498,175 @@ ">> > + */\n" ">> > +int peci_request_status(struct peci_request *req)\n" ">> > +{\n" - ">> > +???????u8 cc = peci_request_data_cc(req);\n" - ">> > +\n" - ">> > +???????if (cc != PECI_CC_SUCCESS)\n" - ">> > +???????????????dev_dbg(&req->device->dev, \"ret: %#02x\\n\", cc);\n" - ">> > +\n" - ">> > +???????switch (cc) {\n" - ">> > +???????case PECI_CC_SUCCESS:\n" - ">> > +???????????????return 0;\n" - ">> > +???????case PECI_CC_NEED_RETRY:\n" - ">> > +???????case PECI_CC_OUT_OF_RESOURCE:\n" - ">> > +???????case PECI_CC_UNAVAIL_RESOURCE:\n" - ">> > +???????????????return -EAGAIN;\n" - ">> > +???????case PECI_CC_INVALID_REQ:\n" - ">> > +???????????????return -EINVAL;\n" - ">> > +???????case PECI_CC_MCA_ERROR:\n" - ">> > +???????case PECI_CC_CATASTROPHIC_MCA_ERROR:\n" - ">> > +???????case PECI_CC_FATAL_MCA_ERROR:\n" - ">> > +???????case PECI_CC_PARITY_ERR_GPSB_OR_PMSB:\n" - ">> > +???????case PECI_CC_PARITY_ERR_GPSB_OR_PMSB_IERR:\n" - ">> > +???????case PECI_CC_PARITY_ERR_GPSB_OR_PMSB_MCA:\n" - ">> > +???????????????return -EIO;\n" - ">> > +???????}\n" - ">> > +\n" - ">> > +???????WARN_ONCE(1, \"Unknown PECI completion code: %#02x\\n\", cc);\n" - ">> > +\n" - ">> > +???????return -EIO;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240u8 cc = peci_request_data_cc(req);\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (cc != PECI_CC_SUCCESS)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240dev_dbg(&req->device->dev, \"ret: %#02x\\n\", cc);\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240switch (cc) {\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240case PECI_CC_SUCCESS:\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return 0;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240case PECI_CC_NEED_RETRY:\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240case PECI_CC_OUT_OF_RESOURCE:\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240case PECI_CC_UNAVAIL_RESOURCE:\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return -EAGAIN;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240case PECI_CC_INVALID_REQ:\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return -EINVAL;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240case PECI_CC_MCA_ERROR:\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240case PECI_CC_CATASTROPHIC_MCA_ERROR:\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240case PECI_CC_FATAL_MCA_ERROR:\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240case PECI_CC_PARITY_ERR_GPSB_OR_PMSB:\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240case PECI_CC_PARITY_ERR_GPSB_OR_PMSB_IERR:\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240case PECI_CC_PARITY_ERR_GPSB_OR_PMSB_MCA:\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return -EIO;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240}\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240WARN_ONCE(1, \"Unknown PECI completion code: %#02x\\n\", cc);\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return -EIO;\n" ">> > +}\n" ">> > +EXPORT_SYMBOL_NS_GPL(peci_request_status, PECI);\n" ">> > +\n" ">> > +static int peci_request_xfer(struct peci_request *req)\n" ">> > +{\n" - ">> > +???????struct peci_device *device = req->device;\n" - ">> > +???????struct peci_controller *controller = device->controller;\n" - ">> > +???????int ret;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_device *device = req->device;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_controller *controller = device->controller;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240int ret;\n" ">> > +\n" - ">> > +???????mutex_lock(&controller->bus_lock);\n" - ">> > +???????ret = controller->xfer(controller, device->addr, req);\n" - ">> > +???????mutex_unlock(&controller->bus_lock);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240mutex_lock(&controller->bus_lock);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = controller->xfer(controller, device->addr, req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240mutex_unlock(&controller->bus_lock);\n" ">> > +\n" - ">> > +???????return ret;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ret;\n" ">> > +}\n" ">> > +\n" ">> > +static int peci_request_xfer_retry(struct peci_request *req)\n" ">> > +{\n" - ">> > +???????long wait_interval = PECI_RETRY_INTERVAL_MIN;\n" - ">> > +???????struct peci_device *device = req->device;\n" - ">> > +???????struct peci_controller *controller = device->controller;\n" - ">> > +???????unsigned long start = jiffies;\n" - ">> > +???????int ret;\n" - ">> > +\n" - ">> > +???????/* Don't try to use it for ping */\n" - ">> > +???????if (WARN_ON(!req->rx.buf))\n" - ">> > +???????????????return 0;\n" - ">> > +\n" - ">> > +???????do {\n" - ">> > +???????????????ret = peci_request_xfer(req);\n" - ">> > +???????????????if (ret) {\n" - ">> > +???????????????????????dev_dbg(&controller->dev, \"xfer error: %d\\n\", ret);\n" - ">> > +???????????????????????return ret;\n" - ">> > +???????????????}\n" - ">> > +\n" - ">> > +???????????????if (peci_request_status(req) != -EAGAIN)\n" - ">> > +???????????????????????return 0;\n" - ">> > +\n" - ">> > +???????????????/* Set the retry bit to indicate a retry attempt */\n" - ">> > +???????????????req->tx.buf[1] |= PECI_RETRY_BIT;\n" - ">> > +\n" - ">> > +???????????????if (schedule_timeout_interruptible(wait_interval))\n" - ">> > +???????????????????????return -ERESTARTSYS;\n" - ">> > +\n" - ">> > +???????????????wait_interval *= 2;\n" - ">> > +???????????????if (wait_interval > PECI_RETRY_INTERVAL_MAX)\n" - ">> > +???????????????????????wait_interval = PECI_RETRY_INTERVAL_MAX;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240long wait_interval = PECI_RETRY_INTERVAL_MIN;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_device *device = req->device;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_controller *controller = device->controller;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240unsigned long start = jiffies;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240int ret;\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240/* Don't try to use it for ping */\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (WARN_ON(!req->rx.buf))\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return 0;\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240do {\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = peci_request_xfer(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret) {\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240dev_dbg(&controller->dev, \"xfer error: %d\\n\", ret);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ret;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240}\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (peci_request_status(req) != -EAGAIN)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return 0;\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240/* Set the retry bit to indicate a retry attempt */\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240req->tx.buf[1] |= PECI_RETRY_BIT;\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (schedule_timeout_interruptible(wait_interval))\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return -ERESTARTSYS;\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240wait_interval *= 2;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (wait_interval > PECI_RETRY_INTERVAL_MAX)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240wait_interval = PECI_RETRY_INTERVAL_MAX;\n" ">>\n" ">> wait_interval = min(wait_interval * 2, PECI_RETRY_INTERVAL_MAX) ?\n" ">\n" ">Ack.\n" ">\n" ">>\n" - ">> > +???????} while (time_before(jiffies, start + PECI_RETRY_TIMEOUT));\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240} while (time_before(jiffies, start + PECI_RETRY_TIMEOUT));\n" ">> > +\n" - ">> > +???????dev_dbg(&controller->dev, \"request timed out\\n\");\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240dev_dbg(&controller->dev, \"request timed out\\n\");\n" ">> > +\n" - ">> > +???????return -ETIMEDOUT;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return -ETIMEDOUT;\n" ">> > +}\n" ">> > +\n" ">> > /**\n" - ">> > ?* peci_request_alloc() - allocate &struct peci_request with buffers with\n" + ">> > \302\240* peci_request_alloc() - allocate &struct peci_request with buffers with\n" ">> > given lengths\n" - ">> > ?* @device: PECI device to which request is going to be sent\n" + ">> > \302\240* @device: PECI device to which request is going to be sent\n" ">> > @@ -72,3 +201,91 @@ void peci_request_free(struct peci_request *req)\n" - ">> > ????????kfree(req);\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240kfree(req);\n" ">> > }\n" ">> > EXPORT_SYMBOL_NS_GPL(peci_request_free, PECI);\n" ">> > +\n" ">> > +struct peci_request *peci_get_dib(struct peci_device *device)\n" ">> > +{\n" - ">> > +???????struct peci_request *req;\n" - ">> > +???????int ret;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_request *req;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240int ret;\n" ">> > +\n" - ">> > +???????req = peci_request_alloc(device, PECI_GET_DIB_WR_LEN,\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240req = peci_request_alloc(device, PECI_GET_DIB_WR_LEN,\n" ">> > PECI_GET_DIB_RD_LEN);\n" - ">> > +???????if (!req)\n" - ">> > +???????????????return ERR_PTR(-ENOMEM);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (!req)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ERR_PTR(-ENOMEM);\n" ">> > +\n" - ">> > +???????req->tx.buf[0] = PECI_GET_DIB_CMD;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240req->tx.buf[0] = PECI_GET_DIB_CMD;\n" ">> > +\n" - ">> > +???????ret = peci_request_xfer(req);\n" - ">> > +???????if (ret) {\n" - ">> > +???????????????peci_request_free(req);\n" - ">> > +???????????????return ERR_PTR(ret);\n" - ">> > +???????}\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = peci_request_xfer(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret) {\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240peci_request_free(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ERR_PTR(ret);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240}\n" ">> > +\n" - ">> > +???????return req;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return req;\n" ">> > +}\n" ">> > +EXPORT_SYMBOL_NS_GPL(peci_get_dib, PECI);\n" ">> > +\n" ">> > +static struct peci_request *\n" ">> > +__pkg_cfg_read(struct peci_device *device, u8 index, u16 param, u8 len)\n" ">> > +{\n" - ">> > +???????struct peci_request *req;\n" - ">> > +???????int ret;\n" - ">> > +\n" - ">> > +???????req = peci_request_alloc(device, PECI_RDPKGCFG_WRITE_LEN,\n" - ">> > +??????????????????????????????? PECI_RDPKGCFG_READ_LEN_BASE + len);\n" - ">> > +???????if (!req)\n" - ">> > +???????????????return ERR_PTR(-ENOMEM);\n" - ">> > +\n" - ">> > +???????req->tx.buf[0] = PECI_RDPKGCFG_CMD;\n" - ">> > +???????req->tx.buf[1] = 0;\n" - ">> > +???????req->tx.buf[2] = index;\n" - ">> > +???????put_unaligned_le16(param, &req->tx.buf[3]);\n" - ">> > +\n" - ">> > +???????ret = peci_request_xfer_retry(req);\n" - ">> > +???????if (ret) {\n" - ">> > +???????????????peci_request_free(req);\n" - ">> > +???????????????return ERR_PTR(ret);\n" - ">> > +???????}\n" - ">> > +\n" - ">> > +???????return req;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_request *req;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240int ret;\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240req = peci_request_alloc(device, PECI_RDPKGCFG_WRITE_LEN,\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240 PECI_RDPKGCFG_READ_LEN_BASE + len);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (!req)\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ERR_PTR(-ENOMEM);\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240req->tx.buf[0] = PECI_RDPKGCFG_CMD;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240req->tx.buf[1] = 0;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240req->tx.buf[2] = index;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240put_unaligned_le16(param, &req->tx.buf[3]);\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = peci_request_xfer_retry(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret) {\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240peci_request_free(req);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ERR_PTR(ret);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240}\n" + ">> > +\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return req;\n" ">> > +}\n" ">> > +\n" ">> > +u8 peci_request_data_readb(struct peci_request *req)\n" ">> > +{\n" - ">> > +???????return req->rx.buf[1];\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return req->rx.buf[1];\n" ">> > +}\n" ">> > +EXPORT_SYMBOL_NS_GPL(peci_request_data_readb, PECI);\n" ">> > +\n" ">> > +u16 peci_request_data_readw(struct peci_request *req)\n" ">> > +{\n" - ">> > +???????return get_unaligned_le16(&req->rx.buf[1]);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return get_unaligned_le16(&req->rx.buf[1]);\n" ">> > +}\n" ">> > +EXPORT_SYMBOL_NS_GPL(peci_request_data_readw, PECI);\n" ">> > +\n" ">> > +u32 peci_request_data_readl(struct peci_request *req)\n" ">> > +{\n" - ">> > +???????return get_unaligned_le32(&req->rx.buf[1]);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return get_unaligned_le32(&req->rx.buf[1]);\n" ">> > +}\n" ">> > +EXPORT_SYMBOL_NS_GPL(peci_request_data_readl, PECI);\n" ">> > +\n" ">> > +u64 peci_request_data_readq(struct peci_request *req)\n" ">> > +{\n" - ">> > +???????return get_unaligned_le64(&req->rx.buf[1]);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return get_unaligned_le64(&req->rx.buf[1]);\n" ">> > +}\n" ">> > +EXPORT_SYMBOL_NS_GPL(peci_request_data_readq, PECI);\n" ">> > +\n" ">> > +u64 peci_request_data_dib(struct peci_request *req)\n" ">> > +{\n" - ">> > +???????return get_unaligned_le64(&req->rx.buf[0]);\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return get_unaligned_le64(&req->rx.buf[0]);\n" ">> > +}\n" ">> > +EXPORT_SYMBOL_NS_GPL(peci_request_data_dib, PECI);\n" ">> > +\n" @@ -647,10 +674,10 @@ ">> > +struct peci_request *peci_pkg_cfg_##x(struct peci_device *device, u8 index,\n" ">> > u16 param) \\\n" ">> > +{ \\\n" - ">> > +???????return __pkg_cfg_read(device, index, param, sizeof(type)); \\\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return __pkg_cfg_read(device, index, param, sizeof(type)); \\\n" ">> > +} \\\n" ">>\n" - ">> Is there a reason for this particular API?? I'd think a more natural one\n" + ">> Is there a reason for this particular API?\302\240 I'd think a more natural one\n" ">> that would offload a bit of boilerplate from callers would look more like\n" ">>\n" ">> int peci_pkg_cfg_##x(struct peci_device *device, u8 index, u16 param, type\n" @@ -682,42 +709,42 @@ ">> > #include <linux/mutex.h>\n" ">> > #include <linux/types.h>\n" ">> >\n" - ">> > +#define PECI_PCS_PKG_ID????????????????????????0? /* Package Identifier\n" + ">> > +#define PECI_PCS_PKG_ID\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400\302\240 /* Package Identifier\n" ">> > Read */\n" - ">> > +#define? PECI_PKG_ID_CPU_ID????????????0x0000? /* CPUID Info */\n" - ">> > +#define? PECI_PKG_ID_PLATFORM_ID???????0x0001? /* Platform ID */\n" - ">> > +#define? PECI_PKG_ID_DEVICE_ID?????????0x0002? /* Uncore Device ID */\n" - ">> > +#define? PECI_PKG_ID_MAX_THREAD_ID?????0x0003? /* Max Thread ID */\n" - ">> > +#define? PECI_PKG_ID_MICROCODE_REV?????0x0004? /* CPU Microcode Update\n" + ">> > +#define\302\240 PECI_PKG_ID_CPU_ID\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400x0000\302\240 /* CPUID Info */\n" + ">> > +#define\302\240 PECI_PKG_ID_PLATFORM_ID\302\240\302\240\302\240\302\240\302\240\302\240\302\2400x0001\302\240 /* Platform ID */\n" + ">> > +#define\302\240 PECI_PKG_ID_DEVICE_ID\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\2400x0002\302\240 /* Uncore Device ID */\n" + ">> > +#define\302\240 PECI_PKG_ID_MAX_THREAD_ID\302\240\302\240\302\240\302\240\302\2400x0003\302\240 /* Max Thread ID */\n" + ">> > +#define\302\240 PECI_PKG_ID_MICROCODE_REV\302\240\302\240\302\240\302\240\302\2400x0004\302\240 /* CPU Microcode Update\n" ">> > Revision */\n" - ">> > +#define? PECI_PKG_ID_MCA_ERROR_LOG?????0x0005? /* Machine Check Status */\n" + ">> > +#define\302\240 PECI_PKG_ID_MCA_ERROR_LOG\302\240\302\240\302\240\302\240\302\2400x0005\302\240 /* Machine Check Status */\n" ">> > +\n" ">> > struct peci_request;\n" ">> >\n" ">> > /**\n" ">> > @@ -41,6 +49,11 @@ static inline struct peci_controller\n" ">> > *to_peci_controller(void *d)\n" - ">> > ?* struct peci_device - PECI device\n" - ">> > ?* @dev: device object to register PECI device to the device model\n" - ">> > ?* @controller: manages the bus segment hosting this PECI device\n" + ">> > \302\240* struct peci_device - PECI device\n" + ">> > \302\240* @dev: device object to register PECI device to the device model\n" + ">> > \302\240* @controller: manages the bus segment hosting this PECI device\n" ">> > + * @info: PECI device characteristics\n" ">> > + * @info.family: device family\n" ">> > + * @info.model: device model\n" ">> > + * @info.peci_revision: PECI revision supported by the PECI device\n" ">> > + * @info.socket_id: the socket ID represented by the PECI device\n" - ">> > ?* @addr: address used on the PECI bus connected to the parent controller\n" - ">> > ?*\n" - ">> > ?* A peci_device identifies a single device (i.e. CPU) connected to a PECI\n" + ">> > \302\240* @addr: address used on the PECI bus connected to the parent controller\n" + ">> > \302\240*\n" + ">> > \302\240* A peci_device identifies a single device (i.e. CPU) connected to a PECI\n" ">> > bus.\n" ">> > @@ -50,6 +63,12 @@ static inline struct peci_controller\n" ">> > *to_peci_controller(void *d)\n" ">> > struct peci_device {\n" - ">> > ????????struct device dev;\n" - ">> > ????????struct peci_controller *controller;\n" - ">> > +???????struct {\n" - ">> > +???????????????u16 family;\n" - ">> > +???????????????u8 model;\n" - ">> > +???????????????u8 peci_revision;\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct device dev;\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct peci_controller *controller;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct {\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240u16 family;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240u8 model;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240u8 peci_revision;\n" ">>\n" ">> This field gets set but doesn't seem to end up used anywhere; is it\n" ">> useful?\n" @@ -732,9 +759,9 @@ ">-Iwona\n" ">\n" ">>\n" - ">> > +???????????????u8 socket_id;\n" - ">> > +???????} info;\n" - ">> > ????????u8 addr;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240u8 socket_id;\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240} info;\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240u8 addr;\n" ">> > };\n" ">> >\n" ">> > diff --git a/lib/Kconfig b/lib/Kconfig\n" @@ -744,12 +771,16 @@ ">> > @@ -721,5 +721,5 @@ config ASN1_ENCODER\n" ">> >\n" ">> > config GENERIC_LIB_X86\n" - ">> > ????????bool\n" - ">> > -???????depends on X86\n" - ">> > +???????depends on X86 || PECI\n" - ">> > ????????default n\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240bool\n" + ">> > -\302\240\302\240\302\240\302\240\302\240\302\240\302\240depends on X86\n" + ">> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240depends on X86 || PECI\n" + ">> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240default n\n" ">> > --\n" ">> > 2.31.1\n" - > + ">\n" + "_______________________________________________\n" + "linux-arm-kernel mailing list\n" + "linux-arm-kernel@lists.infradead.org\n" + http://lists.infradead.org/mailman/listinfo/linux-arm-kernel -59cebbc101d3bc33ab3be319d67420d863e647d7adc3ae35d9c3e03b17c38743 +5522423afc59794b91216ac92a8a9089bc7d5736b310e4c16615288c398bec70
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.