Skip to contentSkip to conversation

powerpc/83xx: Fix few build errors with CONFIG_QUICC_ENGINE=n

PATCH Applied Anton Vorontsov 4 participants 12 messages Dec 5, 2008 – Dec 30, 2008

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 powerpc/83xx: Fix few build errors with CONFIG_QUICC_ENGINE=n

Some 83xx boards were not ready for the optional QUICC Engine support.

This patch fixes following build errors:

arch/powerpc/platforms/built-in.o: In function `flush_disable_caches':
(.text+0xb308): undefined reference to `par_io_data_set'
arch/powerpc/platforms/built-in.o: In function `flush_disable_caches':
(.text+0xb334): undefined reference to `par_io_data_set'
arch/powerpc/platforms/built-in.o: In function `flush_disable_caches':
(.text+0xb408): undefined reference to `qe_ic_get_high_irq'
arch/powerpc/platforms/built-in.o: In function `flush_disable_caches':
(.text+0xb478): undefined reference to `qe_ic_get_low_irq'
arch/powerpc/platforms/built-in.o: In function `mpc832x_spi_init':
mpc832x_rdb.c:(.init.text+0x574c): undefined reference to par_io_config_pin' mpc832x_rdb.c:(.init.text+0x5768): undefined reference to par_io_config_pin' mpc832x_rdb.c:(.init.text+0x5784): undefined reference to par_io_config_pin' mpc832x_rdb.c:(.init.text+0x57a0): undefined reference to par_io_config_pin' mpc832x_rdb.c:(.init.text+0x57bc): undefined reference to par_io_config_pin' arch/powerpc/platforms/built-in.o:mpc832x_rdb.c:(.init.text+0x57d8): more undefined references to par_io_config_pin' follow arch/powerpc/platforms/built-in.o: In function `mpc836x_rdk_init_IRQ':
mpc836x_rdk.c:(.init.text+0x5e84): undefined reference to qe_ic_init' arch/powerpc/platforms/built-in.o: In function mpc836x_rdk_setup_arch':
mpc836x_rdk.c:(.init.text+0x5f10): undefined reference to `qe_reset'
make: *** [.tmp_vmlinux1] Error 1

---

This patch implements traditional way of !QE case handling. Alternative version is coming (w/o ifdefs in the board files).

p.s. I don't know if it is 2.6.28 material...

 arch/powerpc/platforms/83xx/mpc832x_rdb.c |    3 ++-
 arch/powerpc/platforms/83xx/mpc836x_rdk.c |    6 ++++--
 2 files changed, 6 insertions(+), 3 deletions(-)
arch/powerpc/platforms/83xx/mpc832x_rdb.c +2 -1
index 0300268..7e20e91 100644
@@ -38,6 +38,7 @@
 #define DBG(fmt...)
 #endif
 
+#ifdef CONFIG_QUICC_ENGINE
 static void mpc83xx_spi_activate_cs(u8 cs, u8 polarity)
 {
 	pr_debug("%s %d %d\n", __func__, cs, polarity);
@@ -77,8 +78,8 @@ static int __init mpc832x_spi_init(void)
 			    mpc83xx_spi_activate_cs,
 			    mpc83xx_spi_deactivate_cs);
 }
-
 machine_device_initcall(mpc832x_rdb, mpc832x_spi_init);
+#endif /* CONFIG_QUICC_ENGINE */
 
 /* ************************************************************************
  *
arch/powerpc/platforms/83xx/mpc836x_rdk.c +4 -2
index a5273bb..b0090aa 100644
@@ -51,8 +51,9 @@ static void __init mpc836x_rdk_setup_arch(void)
 	for_each_compatible_node(np, "pci", "fsl,mpc8349-pci")
 		mpc83xx_add_bridge(np);
 #endif
-
+#ifdef CONFIG_QUICC_ENGINE
 	qe_reset();
+#endif
 }
 
 static void __init mpc836x_rdk_init_IRQ(void)
@@ -71,13 +72,14 @@ static void __init mpc836x_rdk_init_IRQ(void)
 	 */
 	ipic_set_default_priority();
 	of_node_put(np);
-
+#ifdef CONFIG_QUICC_ENGINE
 	np = of_find_compatible_node(NULL, NULL, "fsl,qe-ic");
 	if (!np)
 		return;
 
 	qe_ic_init(np, 0, qe_ic_cascade_low_ipic, qe_ic_cascade_high_ipic);
 	of_node_put(np);
+#endif
 }
 
 /*
Signature · 1 line
1.5.6.5
#1 lore raw

PATCH 1/1 powerpc/qe: Fix few build errors with CONFIG_QUICC_ENGINE=n

Some 83xx boards were not ready for the optional QUICC Engine support.

This patch fixes following build errors:

arch/powerpc/platforms/built-in.o: In function `flush_disable_caches':
(.text+0xb308): undefined reference to `par_io_data_set'
arch/powerpc/platforms/built-in.o: In function `flush_disable_caches':
(.text+0xb334): undefined reference to `par_io_data_set'
arch/powerpc/platforms/built-in.o: In function `flush_disable_caches':
(.text+0xb408): undefined reference to `qe_ic_get_high_irq'
arch/powerpc/platforms/built-in.o: In function `flush_disable_caches':
(.text+0xb478): undefined reference to `qe_ic_get_low_irq'
arch/powerpc/platforms/built-in.o: In function `mpc832x_spi_init':
mpc832x_rdb.c:(.init.text+0x574c): undefined reference to par_io_config_pin' mpc832x_rdb.c:(.init.text+0x5768): undefined reference to par_io_config_pin' mpc832x_rdb.c:(.init.text+0x5784): undefined reference to par_io_config_pin' mpc832x_rdb.c:(.init.text+0x57a0): undefined reference to par_io_config_pin' mpc832x_rdb.c:(.init.text+0x57bc): undefined reference to par_io_config_pin' arch/powerpc/platforms/built-in.o:mpc832x_rdb.c:(.init.text+0x57d8): more undefined references to par_io_config_pin' follow arch/powerpc/platforms/built-in.o: In function `mpc836x_rdk_init_IRQ':
mpc836x_rdk.c:(.init.text+0x5e84): undefined reference to qe_ic_init' arch/powerpc/platforms/built-in.o: In function mpc836x_rdk_setup_arch':
mpc836x_rdk.c:(.init.text+0x5f10): undefined reference to `qe_reset'
make: *** [.tmp_vmlinux1] Error 1

---
 arch/powerpc/include/asm/qe.h    |   16 ++++++++++++++--
 arch/powerpc/include/asm/qe_ic.h |   21 +++++++++++++++++----
 2 files changed, 31 insertions(+), 6 deletions(-)
arch/powerpc/include/asm/qe.h +14 -2
index 3227440..a0a1531 100644
@@ -86,7 +86,11 @@ static inline bool qe_clock_is_brg(enum qe_clock clk)
 extern spinlock_t cmxgcr_lock;
 
 /* Export QE common operations */
+#ifdef CONFIG_QUICC_ENGINE
 extern void __init qe_reset(void);
+#else
+static inline void qe_reset(void) {}
+#endif
 
 /* QE PIO */
 #define QE_PIO_PINS 32
@@ -103,16 +107,24 @@ struct qe_pio_regs {
 #endif
 };
 
-extern int par_io_init(struct device_node *np);
-extern int par_io_of_config(struct device_node *np);
 #define QE_PIO_DIR_IN	2
 #define QE_PIO_DIR_OUT	1
 extern void __par_io_config_pin(struct qe_pio_regs __iomem *par_io, u8 pin,
 				int dir, int open_drain, int assignment,
 				int has_irq);
+#ifdef CONFIG_QUICC_ENGINE
+extern int par_io_init(struct device_node *np);
+extern int par_io_of_config(struct device_node *np);
 extern int par_io_config_pin(u8 port, u8 pin, int dir, int open_drain,
 			     int assignment, int has_irq);
 extern int par_io_data_set(u8 port, u8 pin, u8 val);
+#else
+static inline int par_io_init(struct device_node *np) { return -ENOSYS; }
+static inline int par_io_of_config(struct device_node *np) { return -ENOSYS; }
+static inline int par_io_config_pin(u8 port, u8 pin, int dir, int open_drain,
+		int assignment, int has_irq) { return -ENOSYS; }
+static inline int par_io_data_set(u8 port, u8 pin, u8 val) { return -ENOSYS; }
+#endif /* CONFIG_QUICC_ENGINE */
 
 /*
  * Pin multiplexing functions.
arch/powerpc/include/asm/qe_ic.h +17 -4
index 56a7745..cf51966 100644
@@ -17,6 +17,9 @@
 
 #include <linux/irq.h>
 
+struct device_node;
+struct qe_ic;
+
 #define NUM_OF_QE_IC_GROUPS	6
 
 /* Flags when we init the QE IC */
@@ -54,17 +57,27 @@ enum qe_ic_grp_id {
 	QE_IC_GRP_RISCB		/* QE interrupt controller RISC group B */
 };
 
+#ifdef CONFIG_QUICC_ENGINE
 void qe_ic_init(struct device_node *node, unsigned int flags,
 		void (*low_handler)(unsigned int irq, struct irq_desc *desc),
 		void (*high_handler)(unsigned int irq, struct irq_desc *desc));
+unsigned int qe_ic_get_low_irq(struct qe_ic *qe_ic);
+unsigned int qe_ic_get_high_irq(struct qe_ic *qe_ic);
+#else
+static inline void qe_ic_init(struct device_node *node, unsigned int flags,
+		void (*low_handler)(unsigned int irq, struct irq_desc *desc),
+		void (*high_handler)(unsigned int irq, struct irq_desc *desc))
+{}
+static inline unsigned int qe_ic_get_low_irq(struct qe_ic *qe_ic)
+{ return 0; }
+static inline unsigned int qe_ic_get_high_irq(struct qe_ic *qe_ic)
+{ return 0; }
+#endif /* CONFIG_QUICC_ENGINE */
+
 void qe_ic_set_highest_priority(unsigned int virq, int high);
 int qe_ic_set_priority(unsigned int virq, unsigned int priority);
 int qe_ic_set_high_priority(unsigned int virq, unsigned int priority, int high);
 
-struct qe_ic;
-unsigned int qe_ic_get_low_irq(struct qe_ic *qe_ic);
-unsigned int qe_ic_get_high_irq(struct qe_ic *qe_ic);
-
 static inline void qe_ic_cascade_low_ipic(unsigned int irq,
 					  struct irq_desc *desc)
 {
Signature · 1 line
1.5.6.5
Applied
#2 lore raw

Re: [PATCH] powerpc/qe: Fix few build errors with CONFIG_QUICC_ENGINE=n

Quoted 25 lines · Anton Vorontsov

Some 83xx boards were not ready for the optional QUICC Engine support.

This patch fixes following build errors:

arch/powerpc/platforms/built-in.o: In function `flush_disable_caches':
(.text+0xb308): undefined reference to `par_io_data_set'
arch/powerpc/platforms/built-in.o: In function `flush_disable_caches':
(.text+0xb334): undefined reference to `par_io_data_set'
arch/powerpc/platforms/built-in.o: In function `flush_disable_caches':
(.text+0xb408): undefined reference to `qe_ic_get_high_irq'
arch/powerpc/platforms/built-in.o: In function `flush_disable_caches':
(.text+0xb478): undefined reference to `qe_ic_get_low_irq'
arch/powerpc/platforms/built-in.o: In function `mpc832x_spi_init':
mpc832x_rdb.c:(.init.text+0x574c): undefined reference to par_io_config_pin' mpc832x_rdb.c:(.init.text+0x5768): undefined reference to par_io_config_pin' mpc832x_rdb.c:(.init.text+0x5784): undefined reference to par_io_config_pin' mpc832x_rdb.c:(.init.text+0x57a0): undefined reference to par_io_config_pin' mpc832x_rdb.c:(.init.text+0x57bc): undefined reference to par_io_config_pin' arch/powerpc/platforms/built-in.o:mpc832x_rdb.c:(.init.text+0x57d8): more undefined references to par_io_config_pin' follow arch/powerpc/platforms/built-in.o: In function `mpc836x_rdk_init_IRQ':
mpc836x_rdk.c:(.init.text+0x5e84): undefined reference to qe_ic_init' arch/powerpc/platforms/built-in.o: In function mpc836x_rdk_setup_arch':
mpc836x_rdk.c:(.init.text+0x5f10): undefined reference to `qe_reset'
make: *** [.tmp_vmlinux1] Error 1

Quoted 5 lines

---

arch/powerpc/include/asm/qe.h    |   16 ++++++++++++++--
arch/powerpc/include/asm/qe_ic.h |   21 +++++++++++++++++----
2 files changed, 31 insertions(+), 6 deletions(-)

applied to next

- k

#3 lore raw
In reply to Anton Vorontsov
Quoted 8 lines · Anton Vorontsov

This patch implements traditional way of !QE case handling. Alternative version is coming (w/o ifdefs in the board files).

p.s. I don't know if it is 2.6.28 material...

arch/powerpc/platforms/83xx/mpc832x_rdb.c |    3 ++-
arch/powerpc/platforms/83xx/mpc836x_rdk.c |    6 ++++--
2 files changed, 6 insertions(+), 3 deletions(-)

this doesn't seem critical right now so I'd say we wait for .29

- k

#4 lore raw
Quoted 1 line · Kumar Gala

this doesn't seem critical right now so I'd say we wait for .29

I agree. None of the defconfigs or default behavior expose this bug. I don't expect anyone to actually turn off the QE in a real-world situation.

Signature · 2 lines
Timur Tabi
Linux kernel developer at Freescale
#5 lore raw
In reply to Anton Vorontsov
Quoted 25 lines · Anton Vorontsov

Some 83xx boards were not ready for the optional QUICC Engine support.

This patch fixes following build errors:

arch/powerpc/platforms/built-in.o: In function `flush_disable_caches':
(.text+0xb308): undefined reference to `par_io_data_set'
arch/powerpc/platforms/built-in.o: In function `flush_disable_caches':
(.text+0xb334): undefined reference to `par_io_data_set'
arch/powerpc/platforms/built-in.o: In function `flush_disable_caches':
(.text+0xb408): undefined reference to `qe_ic_get_high_irq'
arch/powerpc/platforms/built-in.o: In function `flush_disable_caches':
(.text+0xb478): undefined reference to `qe_ic_get_low_irq'
arch/powerpc/platforms/built-in.o: In function `mpc832x_spi_init':
mpc832x_rdb.c:(.init.text+0x574c): undefined reference to par_io_config_pin' mpc832x_rdb.c:(.init.text+0x5768): undefined reference to par_io_config_pin' mpc832x_rdb.c:(.init.text+0x5784): undefined reference to par_io_config_pin' mpc832x_rdb.c:(.init.text+0x57a0): undefined reference to par_io_config_pin' mpc832x_rdb.c:(.init.text+0x57bc): undefined reference to par_io_config_pin' arch/powerpc/platforms/built-in.o:mpc832x_rdb.c:(.init.text+0x57d8): more undefined references to par_io_config_pin' follow arch/powerpc/platforms/built-in.o: In function `mpc836x_rdk_init_IRQ':
mpc836x_rdk.c:(.init.text+0x5e84): undefined reference to qe_ic_init' arch/powerpc/platforms/built-in.o: In function mpc836x_rdk_setup_arch':
mpc836x_rdk.c:(.init.text+0x5f10): undefined reference to `qe_reset'
make: *** [.tmp_vmlinux1] Error 1

Quoted 7 lines

---

This patch implements traditional way of !QE case handling. Alternative version is coming (w/o ifdefs in the board files).

p.s. I don't know if it is 2.6.28 material...

what's the state of this patch vs the alternate version?

- k

#6 lore raw

On Tue, Dec 16, 2008 at 12:18:07PM -0600, Kumar Gala wrote:
[..]

Quoted 6 lines
Quoted 4 lines

This patch implements traditional way of !QE case handling. Alternative version is coming (w/o ifdefs in the board files).

p.s. I don't know if it is 2.6.28 material...

what's the state of this patch vs the alternate version?

Pros of the alternative version:
- No #ifdefs in .c files.

Cons of the alternative version:
- For this code (assuming QE=n):

        if ((np = of_find_node_by_name(NULL, "par_io")) != NULL)
		par_io_init(np);

GCC can still issue the of_find_node_by_name() call. (I wonder if there is any way to tell gcc that particular function doesn't produce any side-effects so that gcc can optimize it away too).

It's up to you to decide which version you want to merge.

Signature · 3 lines
Anton Vorontsov
email: [email protected]
irc://irc.freenode.net/bd2
#7 lore raw
Quoted 3 lines · Anton Vorontsov

GCC can still issue the of_find_node_by_name() call. (I wonder if there is any way to tell gcc that particular function doesn't produce any side-effects so that gcc can optimize it away too).

__attribute__((pure))

-Scott

#8 lore raw
Quoted 6 lines · Scott Wood
Quoted 3 lines · Anton Vorontsov

GCC can still issue the of_find_node_by_name() call. (I wonder if there is any way to tell gcc that particular function doesn't produce any side-effects so that gcc can optimize it away too).

__attribute__((pure))

Ah, thanks!

But I forgot that of_find_node_by_name() and friends aren't actually "pure", they're getting the node. :-(

Signature · 3 lines
Anton Vorontsov
email: [email protected]
irc://irc.freenode.net/bd2
#9 lore raw
Quoted 6 lines · Anton Vorontsov
Quoted 5 lines · Scott Wood
Quoted 3 lines · Anton Vorontsov

GCC can still issue the of_find_node_by_name() call. (I wonder if there is any way to tell gcc that particular function doesn't produce any side-effects so that gcc can optimize it away too).

Quoted 6 lines
Quoted 1 line

__attribute__((pure))

Ah, thanks!

But I forgot that of_find_node_by_name() and friends aren't actually "pure", they're getting the node. :-(

Looking at include/linux/compiler-gcc.h I'm guessing the proper way to use it is __pure & inclusion of compiler.h

- k

#10 lore raw
In reply to Anton Vorontsov
Quoted 25 lines · Anton Vorontsov

Some 83xx boards were not ready for the optional QUICC Engine support.

This patch fixes following build errors:

arch/powerpc/platforms/built-in.o: In function `flush_disable_caches':
(.text+0xb308): undefined reference to `par_io_data_set'
arch/powerpc/platforms/built-in.o: In function `flush_disable_caches':
(.text+0xb334): undefined reference to `par_io_data_set'
arch/powerpc/platforms/built-in.o: In function `flush_disable_caches':
(.text+0xb408): undefined reference to `qe_ic_get_high_irq'
arch/powerpc/platforms/built-in.o: In function `flush_disable_caches':
(.text+0xb478): undefined reference to `qe_ic_get_low_irq'
arch/powerpc/platforms/built-in.o: In function `mpc832x_spi_init':
mpc832x_rdb.c:(.init.text+0x574c): undefined reference to par_io_config_pin' mpc832x_rdb.c:(.init.text+0x5768): undefined reference to par_io_config_pin' mpc832x_rdb.c:(.init.text+0x5784): undefined reference to par_io_config_pin' mpc832x_rdb.c:(.init.text+0x57a0): undefined reference to par_io_config_pin' mpc832x_rdb.c:(.init.text+0x57bc): undefined reference to par_io_config_pin' arch/powerpc/platforms/built-in.o:mpc832x_rdb.c:(.init.text+0x57d8): more undefined references to par_io_config_pin' follow arch/powerpc/platforms/built-in.o: In function `mpc836x_rdk_init_IRQ':
mpc836x_rdk.c:(.init.text+0x5e84): undefined reference to qe_ic_init' arch/powerpc/platforms/built-in.o: In function mpc836x_rdk_setup_arch':
mpc836x_rdk.c:(.init.text+0x5f10): undefined reference to `qe_reset'
make: *** [.tmp_vmlinux1] Error 1

Quoted 2 lines

---

Kumar,

After all I think we should apply this version.

Soon I'll send cleanup patches for all QE boards to remove need for most #ifdefs.

But so far let's be consistent and do what other boards are doing.

Thanks,

Quoted 68 lines

This patch implements traditional way of !QE case handling. Alternative version is coming (w/o ifdefs in the board files).

p.s. I don't know if it is 2.6.28 material...

 arch/powerpc/platforms/83xx/mpc832x_rdb.c |    3 ++-
 arch/powerpc/platforms/83xx/mpc836x_rdk.c |    6 ++++--
 2 files changed, 6 insertions(+), 3 deletions(-)
arch/powerpc/platforms/83xx/mpc832x_rdb.c +2 -1
index 0300268..7e20e91 100644
@@ -38,6 +38,7 @@
 #define DBG(fmt...)
 #endif
 
+#ifdef CONFIG_QUICC_ENGINE
 static void mpc83xx_spi_activate_cs(u8 cs, u8 polarity)
 {
 	pr_debug("%s %d %d\n", __func__, cs, polarity);
@@ -77,8 +78,8 @@ static int __init mpc832x_spi_init(void)
 			    mpc83xx_spi_activate_cs,
 			    mpc83xx_spi_deactivate_cs);
 }
-
 machine_device_initcall(mpc832x_rdb, mpc832x_spi_init);
+#endif /* CONFIG_QUICC_ENGINE */
 
 /* ************************************************************************
  *
arch/powerpc/platforms/83xx/mpc836x_rdk.c +4 -2
index a5273bb..b0090aa 100644
@@ -51,8 +51,9 @@ static void __init mpc836x_rdk_setup_arch(void)
 	for_each_compatible_node(np, "pci", "fsl,mpc8349-pci")
 		mpc83xx_add_bridge(np);
 #endif
-
+#ifdef CONFIG_QUICC_ENGINE
 	qe_reset();
+#endif
 }
 
 static void __init mpc836x_rdk_init_IRQ(void)
@@ -71,13 +72,14 @@ static void __init mpc836x_rdk_init_IRQ(void)
 	 */
 	ipic_set_default_priority();
 	of_node_put(np);
-
+#ifdef CONFIG_QUICC_ENGINE
 	np = of_find_compatible_node(NULL, NULL, "fsl,qe-ic");
 	if (!np)
 		return;
 
 	qe_ic_init(np, 0, qe_ic_cascade_low_ipic, qe_ic_cascade_high_ipic);
 	of_node_put(np);
+#endif
 }
 
 /*
Signature · 5 lines
1.5.6.5
_______________________________________________
Linuxppc-dev mailing list
[email protected]
https://ozlabs.org/mailman/listinfo/linuxppc-dev
Signature · 3 lines
Anton Vorontsov
email: [email protected]
irc://irc.freenode.net/bd2
Applied
#11 lore raw
In reply to Anton Vorontsov
Quoted 28 lines · Anton Vorontsov

Some 83xx boards were not ready for the optional QUICC Engine support.

This patch fixes following build errors:

arch/powerpc/platforms/built-in.o: In function `flush_disable_caches':
(.text+0xb308): undefined reference to `par_io_data_set'
arch/powerpc/platforms/built-in.o: In function `flush_disable_caches':
(.text+0xb334): undefined reference to `par_io_data_set'
arch/powerpc/platforms/built-in.o: In function `flush_disable_caches':
(.text+0xb408): undefined reference to `qe_ic_get_high_irq'
arch/powerpc/platforms/built-in.o: In function `flush_disable_caches':
(.text+0xb478): undefined reference to `qe_ic_get_low_irq'
arch/powerpc/platforms/built-in.o: In function `mpc832x_spi_init':
mpc832x_rdb.c:(.init.text+0x574c): undefined reference to par_io_config_pin' mpc832x_rdb.c:(.init.text+0x5768): undefined reference to par_io_config_pin' mpc832x_rdb.c:(.init.text+0x5784): undefined reference to par_io_config_pin' mpc832x_rdb.c:(.init.text+0x57a0): undefined reference to par_io_config_pin' mpc832x_rdb.c:(.init.text+0x57bc): undefined reference to par_io_config_pin' arch/powerpc/platforms/built-in.o:mpc832x_rdb.c:(.init.text+0x57d8): more undefined references to par_io_config_pin' follow arch/powerpc/platforms/built-in.o: In function `mpc836x_rdk_init_IRQ':
mpc836x_rdk.c:(.init.text+0x5e84): undefined reference to qe_ic_init' arch/powerpc/platforms/built-in.o: In function mpc836x_rdk_setup_arch':
mpc836x_rdk.c:(.init.text+0x5f10): undefined reference to `qe_reset'
make: *** [.tmp_vmlinux1] Error 1

---

Quoted 8 lines

This patch implements traditional way of !QE case handling. Alternative version is coming (w/o ifdefs in the board files).

p.s. I don't know if it is 2.6.28 material...

arch/powerpc/platforms/83xx/mpc832x_rdb.c |    3 ++-
arch/powerpc/platforms/83xx/mpc836x_rdk.c |    6 ++++--
2 files changed, 6 insertions(+), 3 deletions(-)

applied to next

- k