On Thu, Apr 4, 2024, at 17:41, Niklas Schnelle wrote:
>
> Good find! I do see the same #ifdef in v5 but maybe something else
> changed. I think this was also hidden during both my local test builds
> and kernel test robot because of the PNP -> ACPI || ISA dependency
> which I think implies HAS_IOPORT. So unless I'm missing something we
> can't currently get here with HAS_IOPORT=n. Maybe that changed?

Rihgt, I just found that as well, so the TCG_INFINEON driver
won't ever be enabled without CONFIG_HAS_IOPORT after all.

> I'm now thinking maybe keeping TPM_INF_IO_PORT is the cleaner choice.
> It saves us 4 lines of #ifdeffery at the cost of one sometimes "unused"
> define.

Agreed. I tried it out for reference, but it does get quite ugly,
see below. Alternatively, we could just add a 'depends on HAS_IOPORT'
to this driver after all. Even if it can be used on MMIO, it might
never actually be built without PIO.

     Arnd

diff --git a/drivers/char/tpm/Kconfig b/drivers/char/tpm/Kconfig
index 418c9ed59ffd..852bb9344788 100644
--- a/drivers/char/tpm/Kconfig
+++ b/drivers/char/tpm/Kconfig
@@ -157,7 +157,7 @@ config TCG_ATMEL
 
 config TCG_INFINEON
        tristate "Infineon Technologies TPM Interface"
-       depends on PNP
+       depends on PNP || COMPILE_TEST
        help
          If you have a TPM security chip from Infineon Technologies
          (either SLD 9630 TT 1.1 or SLB 9635 TT 1.2) say Yes and it
diff --git a/drivers/char/tpm/tpm_infineon.c b/drivers/char/tpm/tpm_infineon.c
index 99c6e565ec8d..768ca65960d8 100644
--- a/drivers/char/tpm/tpm_infineon.c
+++ b/drivers/char/tpm/tpm_infineon.c
@@ -51,10 +51,19 @@ struct tpm_inf_dev {
 
 static struct tpm_inf_dev tpm_dev;
 
+static inline bool tpm_is_ioport(struct tpm_inf_dev *dev)
+{
+#ifdef CONFIG_HAS_IOPORT
+       return tpm_dev.iotype == TPM_INF_IO_PORT;
+#else
+       return false;
+#endif
+}
+
 static inline void tpm_data_out(unsigned char data, unsigned char offset)
 {
 #ifdef CONFIG_HAS_IOPORT
-       if (tpm_dev.iotype == TPM_INF_IO_PORT)
+       if (tpm_is_ioport(&tpm_dev))
                outb(data, tpm_dev.data_regs + offset);
        else
 #endif
@@ -64,7 +73,7 @@ static inline void tpm_data_out(unsigned char data, unsigned 
char offset)
 static inline unsigned char tpm_data_in(unsigned char offset)
 {
 #ifdef CONFIG_HAS_IOPORT
-       if (tpm_dev.iotype == TPM_INF_IO_PORT)
+       if (tpm_is_ioport(&tpm_dev))
                return inb(tpm_dev.data_regs + offset);
 #endif
        return readb(tpm_dev.mem_base + tpm_dev.data_regs + offset);
@@ -73,7 +82,7 @@ static inline unsigned char tpm_data_in(unsigned char offset)
 static inline void tpm_config_out(unsigned char data, unsigned char offset)
 {
 #ifdef CONFIG_HAS_IOPORT
-       if (tpm_dev.iotype == TPM_INF_IO_PORT)
+       if (tpm_is_ioport(&tpm_dev))
                outb(data, tpm_dev.config_port + offset);
        else
 #endif
@@ -83,7 +92,7 @@ static inline void tpm_config_out(unsigned char data, 
unsigned char offset)
 static inline unsigned char tpm_config_in(unsigned char offset)
 {
 #ifdef CONFIG_HAS_IOPORT
-       if (tpm_dev.iotype == TPM_INF_IO_PORT)
+       if (tpm_is_ioport(&tpm_dev))
                return inb(tpm_dev.config_port + offset);
 #endif
        return readb(tpm_dev.mem_base + tpm_dev.index_off + offset);
@@ -404,6 +413,7 @@ static int tpm_inf_pnp_probe(struct pnp_dev *dev,
        const char *chipname;
        struct tpm_chip *chip;
 
+#ifdef CONFIG_HAS_IOPORT
        /* read IO-ports through PnP */
        if (pnp_port_valid(dev, 0) && pnp_port_valid(dev, 1) &&
            !(pnp_port_flags(dev, 0) & IORESOURCE_DISABLED)) {
@@ -436,8 +446,10 @@ static int tpm_inf_pnp_probe(struct pnp_dev *dev,
                        rc = -EINVAL;
                        goto err_last;
                }
-       } else if (pnp_mem_valid(dev, 0) &&
-                  !(pnp_mem_flags(dev, 0) & IORESOURCE_DISABLED)) {
+       } else
+#endif
+       if (pnp_mem_valid(dev, 0) &&
+          !(pnp_mem_flags(dev, 0) & IORESOURCE_DISABLED)) {
 
                tpm_dev.iotype = TPM_INF_IO_MEM;
 
@@ -540,10 +552,10 @@ static int tpm_inf_pnp_probe(struct pnp_dev *dev,
                         "vendor id 0x%x%x (Infineon), "
                         "product id 0x%02x%02x"
                         "%s\n",
-                        tpm_dev.iotype == TPM_INF_IO_PORT ?
+                        tpm_is_ioport(&tpm_dev) ?
                         tpm_dev.config_port :
                         tpm_dev.map_base + tpm_dev.index_off,
-                        tpm_dev.iotype == TPM_INF_IO_PORT ?
+                        tpm_is_ioport(&tpm_dev) ?
                         tpm_dev.data_regs :
                         tpm_dev.map_base + tpm_dev.data_regs,
                         version[0], version[1],
@@ -567,7 +579,7 @@ static int tpm_inf_pnp_probe(struct pnp_dev *dev,
        }
 
 err_release_region:
-       if (tpm_dev.iotype == TPM_INF_IO_PORT) {
+       if (tpm_is_ioport(&tpm_dev)) {
                release_region(tpm_dev.data_regs, tpm_dev.data_size);
                release_region(tpm_dev.config_port, tpm_dev.config_size);
        } else {
@@ -585,11 +597,14 @@ static void tpm_inf_pnp_remove(struct pnp_dev *dev)
 
        tpm_chip_unregister(chip);
 
-       if (tpm_dev.iotype == TPM_INF_IO_PORT) {
+#ifdef CONFIG_HAS_IOPORT
+       if (tpm_is_ioport(&tpm_dev)) {
                release_region(tpm_dev.data_regs, tpm_dev.data_size);
                release_region(tpm_dev.config_port,
                               tpm_dev.config_size);
-       } else {
+       } else
+#endif
+       {
                iounmap(tpm_dev.mem_base);
                release_mem_region(tpm_dev.map_base, tpm_dev.map_size);
        }

Reply via email to