1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (C) 2017 Hisilicon Limited, All Rights Reserved.
4 * Author: Zhichang Yuan <yuanzhichang@hisilicon.com>
5 * Author: Zou Rongrong <zourongrong@huawei.com>
6 * Author: John Garry <john.garry@huawei.com>
9 #include <linux/acpi.h>
10 #include <linux/console.h>
11 #include <linux/delay.h>
13 #include <linux/logic_pio.h>
14 #include <linux/module.h>
16 #include <linux/of_platform.h>
17 #include <linux/pci.h>
18 #include <linux/platform_device.h>
19 #include <linux/serial_8250.h>
20 #include <linux/slab.h>
22 #define DRV_NAME "hisi-lpc"
25 * Setting this bit means each IO operation will target a different port
26 * address; 0 means repeated IO operations will use the same port,
29 #define FG_INCRADDR_LPC 0x02
31 struct lpc_cycle_para
{
33 unsigned int csize
; /* data length of each operation */
37 spinlock_t cycle_lock
;
38 void __iomem
*membase
;
39 struct logic_pio_hwaddr
*io_host
;
42 /* The max IO cycle counts supported is four per operation at maximum */
43 #define LPC_MAX_DWIDTH 4
45 #define LPC_REG_STARTUP_SIGNAL 0x00
46 #define LPC_REG_STARTUP_SIGNAL_START BIT(0)
47 #define LPC_REG_OP_STATUS 0x04
48 #define LPC_REG_OP_STATUS_IDLE BIT(0)
49 #define LPC_REG_OP_STATUS_FINISHED BIT(1)
50 #define LPC_REG_OP_LEN 0x10 /* LPC cycles count per start */
51 #define LPC_REG_CMD 0x14
52 #define LPC_REG_CMD_OP BIT(0) /* 0: read, 1: write */
53 #define LPC_REG_CMD_SAMEADDR BIT(3)
54 #define LPC_REG_ADDR 0x20 /* target address */
55 #define LPC_REG_WDATA 0x24 /* write FIFO */
56 #define LPC_REG_RDATA 0x28 /* read FIFO */
58 /* The minimal nanosecond interval for each query on LPC cycle status */
59 #define LPC_NSEC_PERWAIT 100
62 * The maximum waiting time is about 128us. It is specific for stream I/O,
65 * The fastest IO cycle time is about 390ns, but the worst case will wait
66 * for extra 256 lpc clocks, so (256 + 13) * 30ns = 8 us. The maximum burst
67 * cycles is 16. So, the maximum waiting time is about 128us under worst
70 * Choose 1300 as the maximum.
72 #define LPC_MAX_WAITCNT 1300
74 /* About 10us. This is specific for single IO operations, such as inb */
75 #define LPC_PEROP_WAITCNT 100
77 static int wait_lpc_idle(void __iomem
*mbase
, unsigned int waitcnt
)
82 status
= readl(mbase
+ LPC_REG_OP_STATUS
);
83 if (status
& LPC_REG_OP_STATUS_IDLE
)
84 return (status
& LPC_REG_OP_STATUS_FINISHED
) ? 0 : -EIO
;
85 ndelay(LPC_NSEC_PERWAIT
);
92 * hisi_lpc_target_in - trigger a series of LPC cycles for read operation
93 * @lpcdev: pointer to hisi lpc device
94 * @para: some parameters used to control the lpc I/O operations
95 * @addr: the lpc I/O target port address
96 * @buf: where the read back data is stored
97 * @opcnt: how many I/O operations required, i.e. data width
99 * Returns 0 on success, non-zero on fail.
101 static int hisi_lpc_target_in(struct hisi_lpc_dev
*lpcdev
,
102 struct lpc_cycle_para
*para
, unsigned long addr
,
103 unsigned char *buf
, unsigned long opcnt
)
105 unsigned int cmd_word
;
106 unsigned int waitcnt
;
110 if (!buf
|| !opcnt
|| !para
|| !para
->csize
|| !lpcdev
)
113 cmd_word
= 0; /* IO mode, Read */
114 waitcnt
= LPC_PEROP_WAITCNT
;
115 if (!(para
->opflags
& FG_INCRADDR_LPC
)) {
116 cmd_word
|= LPC_REG_CMD_SAMEADDR
;
117 waitcnt
= LPC_MAX_WAITCNT
;
120 /* whole operation must be atomic */
121 spin_lock_irqsave(&lpcdev
->cycle_lock
, flags
);
123 writel_relaxed(opcnt
, lpcdev
->membase
+ LPC_REG_OP_LEN
);
124 writel_relaxed(cmd_word
, lpcdev
->membase
+ LPC_REG_CMD
);
125 writel_relaxed(addr
, lpcdev
->membase
+ LPC_REG_ADDR
);
127 writel(LPC_REG_STARTUP_SIGNAL_START
,
128 lpcdev
->membase
+ LPC_REG_STARTUP_SIGNAL
);
130 /* whether the operation is finished */
131 ret
= wait_lpc_idle(lpcdev
->membase
, waitcnt
);
133 spin_unlock_irqrestore(&lpcdev
->cycle_lock
, flags
);
137 readsb(lpcdev
->membase
+ LPC_REG_RDATA
, buf
, opcnt
);
139 spin_unlock_irqrestore(&lpcdev
->cycle_lock
, flags
);
145 * hisi_lpc_target_out - trigger a series of LPC cycles for write operation
146 * @lpcdev: pointer to hisi lpc device
147 * @para: some parameters used to control the lpc I/O operations
148 * @addr: the lpc I/O target port address
149 * @buf: where the data to be written is stored
150 * @opcnt: how many I/O operations required, i.e. data width
152 * Returns 0 on success, non-zero on fail.
154 static int hisi_lpc_target_out(struct hisi_lpc_dev
*lpcdev
,
155 struct lpc_cycle_para
*para
, unsigned long addr
,
156 const unsigned char *buf
, unsigned long opcnt
)
158 unsigned int waitcnt
;
163 if (!buf
|| !opcnt
|| !para
|| !lpcdev
)
166 /* default is increasing address */
167 cmd_word
= LPC_REG_CMD_OP
; /* IO mode, write */
168 waitcnt
= LPC_PEROP_WAITCNT
;
169 if (!(para
->opflags
& FG_INCRADDR_LPC
)) {
170 cmd_word
|= LPC_REG_CMD_SAMEADDR
;
171 waitcnt
= LPC_MAX_WAITCNT
;
174 spin_lock_irqsave(&lpcdev
->cycle_lock
, flags
);
176 writel_relaxed(opcnt
, lpcdev
->membase
+ LPC_REG_OP_LEN
);
177 writel_relaxed(cmd_word
, lpcdev
->membase
+ LPC_REG_CMD
);
178 writel_relaxed(addr
, lpcdev
->membase
+ LPC_REG_ADDR
);
180 writesb(lpcdev
->membase
+ LPC_REG_WDATA
, buf
, opcnt
);
182 writel(LPC_REG_STARTUP_SIGNAL_START
,
183 lpcdev
->membase
+ LPC_REG_STARTUP_SIGNAL
);
185 /* whether the operation is finished */
186 ret
= wait_lpc_idle(lpcdev
->membase
, waitcnt
);
188 spin_unlock_irqrestore(&lpcdev
->cycle_lock
, flags
);
193 static unsigned long hisi_lpc_pio_to_addr(struct hisi_lpc_dev
*lpcdev
,
196 return pio
- lpcdev
->io_host
->io_start
+ lpcdev
->io_host
->hw_start
;
200 * hisi_lpc_comm_in - input the data in a single operation
201 * @hostdata: pointer to the device information relevant to LPC controller
202 * @pio: the target I/O port address
203 * @dwidth: the data length required to read from the target I/O port
205 * When success, data is returned. Otherwise, ~0 is returned.
207 static u32
hisi_lpc_comm_in(void *hostdata
, unsigned long pio
, size_t dwidth
)
209 struct hisi_lpc_dev
*lpcdev
= hostdata
;
210 struct lpc_cycle_para iopara
;
215 if (!lpcdev
|| !dwidth
|| dwidth
> LPC_MAX_DWIDTH
)
218 addr
= hisi_lpc_pio_to_addr(lpcdev
, pio
);
220 iopara
.opflags
= FG_INCRADDR_LPC
;
221 iopara
.csize
= dwidth
;
223 ret
= hisi_lpc_target_in(lpcdev
, &iopara
, addr
,
224 (unsigned char *)&rd_data
, dwidth
);
228 return le32_to_cpu(rd_data
);
232 * hisi_lpc_comm_out - output the data in a single operation
233 * @hostdata: pointer to the device information relevant to LPC controller
234 * @pio: the target I/O port address
235 * @val: a value to be output from caller, maximum is four bytes
236 * @dwidth: the data width required writing to the target I/O port
238 * This function corresponds to out(b,w,l) only.
240 static void hisi_lpc_comm_out(void *hostdata
, unsigned long pio
,
241 u32 val
, size_t dwidth
)
243 struct hisi_lpc_dev
*lpcdev
= hostdata
;
244 struct lpc_cycle_para iopara
;
245 const unsigned char *buf
;
247 __le32 _val
= cpu_to_le32(val
);
249 if (!lpcdev
|| !dwidth
|| dwidth
> LPC_MAX_DWIDTH
)
252 buf
= (const unsigned char *)&_val
;
253 addr
= hisi_lpc_pio_to_addr(lpcdev
, pio
);
255 iopara
.opflags
= FG_INCRADDR_LPC
;
256 iopara
.csize
= dwidth
;
258 hisi_lpc_target_out(lpcdev
, &iopara
, addr
, buf
, dwidth
);
262 * hisi_lpc_comm_ins - input the data in the buffer in multiple operations
263 * @hostdata: pointer to the device information relevant to LPC controller
264 * @pio: the target I/O port address
265 * @buffer: a buffer where read/input data bytes are stored
266 * @dwidth: the data width required writing to the target I/O port
267 * @count: how many data units whose length is dwidth will be read
269 * When success, the data read back is stored in buffer pointed by buffer.
270 * Returns 0 on success, -errno otherwise.
272 static u32
hisi_lpc_comm_ins(void *hostdata
, unsigned long pio
, void *buffer
,
273 size_t dwidth
, unsigned int count
)
275 struct hisi_lpc_dev
*lpcdev
= hostdata
;
276 unsigned char *buf
= buffer
;
277 struct lpc_cycle_para iopara
;
280 if (!lpcdev
|| !buf
|| !count
|| !dwidth
|| dwidth
> LPC_MAX_DWIDTH
)
285 iopara
.opflags
|= FG_INCRADDR_LPC
;
286 iopara
.csize
= dwidth
;
288 addr
= hisi_lpc_pio_to_addr(lpcdev
, pio
);
293 ret
= hisi_lpc_target_in(lpcdev
, &iopara
, addr
, buf
, dwidth
);
303 * hisi_lpc_comm_outs - output the data in the buffer in multiple operations
304 * @hostdata: pointer to the device information relevant to LPC controller
305 * @pio: the target I/O port address
306 * @buffer: a buffer where write/output data bytes are stored
307 * @dwidth: the data width required writing to the target I/O port
308 * @count: how many data units whose length is dwidth will be written
310 static void hisi_lpc_comm_outs(void *hostdata
, unsigned long pio
,
311 const void *buffer
, size_t dwidth
,
314 struct hisi_lpc_dev
*lpcdev
= hostdata
;
315 struct lpc_cycle_para iopara
;
316 const unsigned char *buf
= buffer
;
319 if (!lpcdev
|| !buf
|| !count
|| !dwidth
|| dwidth
> LPC_MAX_DWIDTH
)
324 iopara
.opflags
|= FG_INCRADDR_LPC
;
325 iopara
.csize
= dwidth
;
327 addr
= hisi_lpc_pio_to_addr(lpcdev
, pio
);
329 if (hisi_lpc_target_out(lpcdev
, &iopara
, addr
, buf
, dwidth
))
335 static const struct logic_pio_host_ops hisi_lpc_ops
= {
336 .in
= hisi_lpc_comm_in
,
337 .out
= hisi_lpc_comm_out
,
338 .ins
= hisi_lpc_comm_ins
,
339 .outs
= hisi_lpc_comm_outs
,
343 static int hisi_lpc_acpi_xlat_io_res(struct acpi_device
*adev
,
344 struct acpi_device
*host
,
345 struct resource
*res
)
347 unsigned long sys_port
;
348 resource_size_t len
= resource_size(res
);
350 sys_port
= logic_pio_trans_hwaddr(acpi_fwnode_handle(host
), res
->start
, len
);
351 if (sys_port
== ~0UL)
354 res
->start
= sys_port
;
355 res
->end
= sys_port
+ len
;
361 * Released firmware describes the IO port max address as 0x3fff, which is
362 * the max host bus address. Fixup to a proper range. This will probably
363 * never be fixed in firmware.
365 static void hisi_lpc_acpi_fixup_child_resource(struct device
*hostdev
,
368 if (r
->end
!= 0x3fff)
371 if (r
->start
== 0xe4)
372 r
->end
= 0xe4 + 0x04 - 1;
373 else if (r
->start
== 0x2f8)
374 r
->end
= 0x2f8 + 0x08 - 1;
376 dev_warn(hostdev
, "unrecognised resource %pR to fixup, ignoring\n",
381 * hisi_lpc_acpi_set_io_res - set the resources for a child
382 * @adev: ACPI companion of the device node to be updated the I/O resource
383 * @hostdev: the device node associated with host controller
384 * @res: double pointer to be set to the address of translated resources
385 * @num_res: pointer to variable to hold the number of translated resources
387 * Returns 0 when successful, and a negative value for failure.
389 * For a given host controller, each child device will have an associated
390 * host-relative address resource. This function will return the translated
391 * logical PIO addresses for each child devices resources.
393 static int hisi_lpc_acpi_set_io_res(struct acpi_device
*adev
,
394 struct device
*hostdev
,
395 const struct resource
**res
, int *num_res
)
397 struct acpi_device
*host
= to_acpi_device(adev
->dev
.parent
);
398 struct resource_entry
*rentry
;
399 LIST_HEAD(resource_list
);
400 struct resource
*resources
;
404 if (!adev
->status
.present
) {
405 dev_dbg(&adev
->dev
, "device is not present\n");
409 if (acpi_device_enumerated(adev
)) {
410 dev_dbg(&adev
->dev
, "has been enumerated\n");
415 * The following code segment to retrieve the resources is common to
416 * acpi_create_platform_device(), so consider a common helper function
419 count
= acpi_dev_get_resources(adev
, &resource_list
, NULL
, NULL
);
421 dev_dbg(&adev
->dev
, "failed to get resources\n");
422 return count
? count
: -EIO
;
425 resources
= devm_kcalloc(hostdev
, count
, sizeof(*resources
),
428 dev_warn(hostdev
, "could not allocate memory for %d resources\n",
430 acpi_dev_free_resource_list(&resource_list
);
434 list_for_each_entry(rentry
, &resource_list
, node
) {
435 resources
[count
] = *rentry
->res
;
436 hisi_lpc_acpi_fixup_child_resource(hostdev
, &resources
[count
]);
440 acpi_dev_free_resource_list(&resource_list
);
442 /* translate the I/O resources */
443 for (i
= 0; i
< count
; i
++) {
446 if (!(resources
[i
].flags
& IORESOURCE_IO
))
448 ret
= hisi_lpc_acpi_xlat_io_res(adev
, host
, &resources
[i
]);
450 dev_err(&adev
->dev
, "translate IO range %pR failed (%d)\n",
461 static int hisi_lpc_acpi_remove_subdev(struct device
*dev
, void *unused
)
463 platform_device_unregister(to_platform_device(dev
));
467 static int hisi_lpc_acpi_clear_enumerated(struct acpi_device
*adev
, void *not_used
)
469 acpi_device_clear_enumerated(adev
);
473 struct hisi_lpc_acpi_cell
{
475 const struct platform_device_info
*pdevinfo
;
478 static void hisi_lpc_acpi_remove(struct device
*hostdev
)
480 device_for_each_child(hostdev
, NULL
, hisi_lpc_acpi_remove_subdev
);
481 acpi_dev_for_each_child(ACPI_COMPANION(hostdev
),
482 hisi_lpc_acpi_clear_enumerated
, NULL
);
485 static int hisi_lpc_acpi_add_child(struct acpi_device
*child
, void *data
)
487 const char *hid
= acpi_device_hid(child
);
488 struct device
*hostdev
= data
;
489 const struct hisi_lpc_acpi_cell
*cell
;
490 struct platform_device
*pdev
;
491 const struct resource
*res
;
496 ret
= hisi_lpc_acpi_set_io_res(child
, hostdev
, &res
, &num_res
);
498 dev_warn(hostdev
, "set resource fail (%d)\n", ret
);
502 cell
= (struct hisi_lpc_acpi_cell
[]){
506 .pdevinfo
= (struct platform_device_info
[]) {
509 .fwnode
= acpi_fwnode_handle(child
),
510 .name
= "hisi-lpc-ipmi",
511 .id
= PLATFORM_DEVID_AUTO
,
517 /* 8250-compatible uart */
520 .pdevinfo
= (struct platform_device_info
[]) {
523 .fwnode
= acpi_fwnode_handle(child
),
524 .name
= "serial8250",
525 .id
= PLATFORM_DEVID_AUTO
,
528 .data
= (struct plat_serial8250_port
[]) {
530 .iobase
= res
->start
,
533 .flags
= UPF_BOOT_AUTOCONF
,
537 .size_data
= 2 * sizeof(struct plat_serial8250_port
),
544 for (; cell
&& cell
->hid
; cell
++) {
545 if (!strcmp(cell
->hid
, hid
)) {
553 "could not find cell for child device (%s), discarding\n",
558 pdev
= platform_device_register_full(cell
->pdevinfo
);
560 return PTR_ERR(pdev
);
562 acpi_device_set_enumerated(child
);
567 * hisi_lpc_acpi_probe - probe children for ACPI FW
568 * @hostdev: LPC host device pointer
570 * Returns 0 when successful, and a negative value for failure.
572 * Create a platform device per child, fixing up the resources
573 * from bus addresses to Logical PIO addresses.
576 static int hisi_lpc_acpi_probe(struct device
*hostdev
)
580 /* Only consider the children of the host */
581 ret
= acpi_dev_for_each_child(ACPI_COMPANION(hostdev
),
582 hisi_lpc_acpi_add_child
, hostdev
);
584 hisi_lpc_acpi_remove(hostdev
);
589 static int hisi_lpc_acpi_probe(struct device
*dev
)
594 static void hisi_lpc_acpi_remove(struct device
*hostdev
)
597 #endif // CONFIG_ACPI
600 * hisi_lpc_probe - the probe callback function for hisi lpc host,
601 * will finish all the initialization.
602 * @pdev: the platform device corresponding to hisi lpc host
604 * Returns 0 on success, non-zero on fail.
606 static int hisi_lpc_probe(struct platform_device
*pdev
)
608 struct device
*dev
= &pdev
->dev
;
609 struct logic_pio_hwaddr
*range
;
610 struct hisi_lpc_dev
*lpcdev
;
611 resource_size_t io_end
;
614 lpcdev
= devm_kzalloc(dev
, sizeof(*lpcdev
), GFP_KERNEL
);
618 spin_lock_init(&lpcdev
->cycle_lock
);
620 lpcdev
->membase
= devm_platform_ioremap_resource(pdev
, 0);
621 if (IS_ERR(lpcdev
->membase
))
622 return PTR_ERR(lpcdev
->membase
);
624 range
= devm_kzalloc(dev
, sizeof(*range
), GFP_KERNEL
);
628 range
->fwnode
= dev_fwnode(dev
);
629 range
->flags
= LOGIC_PIO_INDIRECT
;
630 range
->size
= PIO_INDIRECT_SIZE
;
631 range
->hostdata
= lpcdev
;
632 range
->ops
= &hisi_lpc_ops
;
633 lpcdev
->io_host
= range
;
635 ret
= logic_pio_register_range(range
);
637 dev_err(dev
, "register IO range failed (%d)!\n", ret
);
641 /* register the LPC host PIO resources */
642 if (is_acpi_device_node(range
->fwnode
))
643 ret
= hisi_lpc_acpi_probe(dev
);
645 ret
= of_platform_populate(dev
->of_node
, NULL
, NULL
, dev
);
647 logic_pio_unregister_range(range
);
651 dev_set_drvdata(dev
, lpcdev
);
653 io_end
= lpcdev
->io_host
->io_start
+ lpcdev
->io_host
->size
;
654 dev_info(dev
, "registered range [%pa - %pa]\n",
655 &lpcdev
->io_host
->io_start
, &io_end
);
660 static void hisi_lpc_remove(struct platform_device
*pdev
)
662 struct device
*dev
= &pdev
->dev
;
663 struct hisi_lpc_dev
*lpcdev
= dev_get_drvdata(dev
);
664 struct logic_pio_hwaddr
*range
= lpcdev
->io_host
;
666 if (is_acpi_device_node(range
->fwnode
))
667 hisi_lpc_acpi_remove(dev
);
669 of_platform_depopulate(dev
);
671 logic_pio_unregister_range(range
);
674 static const struct of_device_id hisi_lpc_of_match
[] = {
675 { .compatible
= "hisilicon,hip06-lpc", },
676 { .compatible
= "hisilicon,hip07-lpc", },
680 static const struct acpi_device_id hisi_lpc_acpi_match
[] = {
685 static struct platform_driver hisi_lpc_driver
= {
688 .of_match_table
= hisi_lpc_of_match
,
689 .acpi_match_table
= hisi_lpc_acpi_match
,
691 .probe
= hisi_lpc_probe
,
692 .remove
= hisi_lpc_remove
,
694 builtin_platform_driver(hisi_lpc_driver
);